2009-02-12 27 views
8

Có cách nào để xác định yếu tố nào đã gửi biểu mẫu từ bên trong trình xử lý onsubmit không? Cố gắng viết một trình xử lý chung để biết phần tử nào đã được nhấp. Ví dụ: được cung cấp biểu mẫu này:Xác định yếu tố nào đã gửi biểu mẫu từ bên trong onsubmit

<form onsubmit="onSubmitHandler"> 
    <input type="submit" name="submit1" /> 
    <input type="submit" name="submit2" /> 
</form> 

Làm cách nào để xác định bên trong nút onSubmitHandler đã gửi nút nào? Tôi đã thử event.target/event.srcElement, nhưng nó cung cấp cho biểu mẫu, chứ không phải nút gửi thực tế.

Cập nhật: Tôi đang viết một điều khiển chung ở đây, do đó, nó không có ý tưởng những gì trên biểu mẫu. Giải pháp cần phải làm việc mà không cần biết và thay đổi html của biểu mẫu. Dự phòng của tôi là đi bộ DOM để tìm tất cả các nút có thể gây ra gửi, nhưng tôi muốn tránh điều đó.

+0

Không có bảo đảm rằng bất kỳ nút gửi nào đã được nhấp. Ví dụ. Gửi bởi JS (form.submit()) sẽ dẫn đến không có giá trị nút nào được bao gồm trong bài đăng trở lại –

+0

Điều đó cũng tốt. Một chút nền tảng về vấn đề này: đây là một thành phần AJAX.Tôi đang hủy bản đệ trình đầu tiên, làm việc của riêng tôi, và sau đó tôi cần chạy lại lần gửi đầu tiên khi nó xảy ra, với tất cả các giá trị biểu mẫu chính xác. Theo như tôi đã có thể xác định, cách duy nhất để làm điều này là để đi bộ DOM và thêm xử lý bấm vào bất cứ điều gì có thể gây ra một trình, và sau đó lưu đó. Giả sử điều cuối cùng được nhấp vào là thứ đã gửi biểu mẫu và sau đó gọi .click() trên đó khi tôi cần gửi lại biểu mẫu. –

Trả lời

3

Một giải pháp thay thế sẽ được di chuyển sự kiện kích hoạt từ sự kiện nộp của hình thức, sự kiện onclick yếu tố nộp, như ví dụ:

<form name='form1'> 
    <input type="submit" name="submit1" onclick="onSubmitHandler"/> 
    <input type="submit" name="submit2" onclick="onSubmitHandler"/> 
</form> 

Trong hàm điều khiển của bạn, bạn có thể xác định các yếu tố trên Facebook Chia đơn giản bằng cách kiểm tra tên của mục tiêu sự kiện và nếu bạn cần quyền truy cập vào thông tin của biểu mẫu hoặc các yếu tố khác, bạn có thể lấy thông tin này từ thuộc tính "biểu mẫu" thuộc tính gửi.

+0

Bạn vẫn cần một trình xử lý onsubmit ngoài những điều này, vì có thể một sự kiện gửi sẽ diễn ra mà không cần nhấn nút. Các spec lá bán mở câu hỏi mà nút (nếu có) được kích hoạt bằng cách nhấn Enter trong khi tập trung vào một điều khiển không nút và các trình duyệt không nhất quán (mặc dù theo thử nghiệm của tôi, có vẻ như đó là nút đầu tiên trên biểu mẫu hoặc không có gì cả). – Stewart

1

Tôi sẽ không sử dụng loại nút gửi tiêu chuẩn.

Tận dụng tối nộp chức năng lấy một cuộc tranh cãi thêm đại diện cho yếu tố đó gửi nó, và nút sẽ có một onclick sẽ gửi this như tham số:

<input type="button" onclick="submitHandler(this)"> 
+0

Điều đó sẽ không nhất thiết phải phá vỡ nút khi JavaScript không khả dụng. – bobince

+0

Nút sẽ vẫn hoạt động mà không có js, nhưng sau đó phương pháp duy nhất để xác định nút thực tế te được nhấn sẽ là một mặt máy chủ. Bạn có thể làm điều đó bằng cách cho nút một giá trị, bằng cách này. – KooiInc

+0

Điều này cần phải được tất cả các phía khách hàng. Tôi không quan tâm đến máy chủ trong trường hợp này. Nó cũng cần phải được chung chung - Tôi không có quyền truy cập vào trang html. –

0

dự phòng của tôi đang đi bộ DOM để tìm tất cả các nút có thể gây ra gửi nhưng tôi muốn tránh điều đó.

... và thêm người nghe nhấp vào họ để lưu trữ nút 'nhấp cuối cùng' sau đó được người đọc gửi, đọc phải không?

Tôi không thể nghĩ ra bất kỳ cách nào khác, xin lỗi.

+0

Vâng, chính xác. Đó là giòn vì nếu một cái gì đó khác trên trang thêm một nút gửi sau khi tôi móc nó sẽ phá vỡ. Nhưng điều đó dường như là lựa chọn tốt nhất, thật không may. –

+0

Hoặc tôi chỉ nên nói tùy chọn. –

0

Giải pháp này hoạt động trong Firefox. Tôi chưa kiểm tra nó trong các trình duyệt hoặc trình duyệt IE tương thích khác.
Tôi không quá hy vọng đối với IE, bạn phải xem xét và đăng kết quả của mình.

<form id="myForm"> 
    <input type="submit"> 
    <input type="submit"> 
</form> 

_

document.getElementById('myForm').addEventListener('submit', function(e){ 
    e.preventDefault(); 
    e.explicitOriginalTarget.style.background = 'red'; 
}, false); 
+0

Điều đó khá ngọt ngào, nhưng có vẻ như không có trên crossbrowser: http://stackoverflow.com/questions/179826/crossbrowser-equivalent-of-explicitoriginaltarget-event-parameter, và tiếc là điều này cần phải xử lý 4 trình duyệt lớn, để một là ra ngoài. –

0

Bấm sự kiện bong bóng, vì vậy bạn chỉ có thể thêm một "onclick" nghe mẫu thân, để kiểm tra nếu nguồn nhấp chuột mục tiêu là một nút gửi; nếu có, lưu trữ một tham chiếu đến nó ở đâu đó liên kết với biểu mẫu mà bạn có thể truy cập từ trình xử lý onsubmit của bạn.

Nếu bạn muốn xử lý các biểu mẫu gửi "Enter" đúng cách, hãy nghe sự kiện "onkeypress" hoặc "onkeydown" của biểu mẫu, chọn "Enter" và xóa thông tin nút gửi nếu mục tiêu sự kiện ISN ' T nút gửi.

Các vấn đề liên quan