2012-10-05 39 views
8

Tôi muốn chạy hàm js khi nhấn nút Enter. Mọi thứ hoạt động tốt trong IE, Chrome và Opera, nhưng tôi gặp lỗi (được giải thích bên dưới) trong Safari.'không xác định' không phải là một hàm đánh giá el.click() trong Safari

Tôi cần một giải pháp Javascript Javascript thuần túy, không phải jQuery.

Đây là chức năng:

function pressSearch(e) { 
    if (typeof e == 'undefined' && window.event) { 
     e = window.event; 
    } 
    var charCode = (e.which) ? e.which : 
        ((e.charCode) ? e.charCode : 
        ((e.keyCode) ? e.keyCode : 0)); 
    if (charCode == 13) { 
     document.getElementById('enterSearch').click(); 
    } 
} 

Đây là HTML:

<input type="text" id="searchKey" onkeypress="pressSearch(event)"> 
<div id="enterSearch">Search</div> // This is the "button" 

tôi nhận được lỗi này:

// Safari 
TypeError: 'undefined' is not a function 
    (evaluating 'getElementById('enterSearch').click()') 

Tôi đang làm gì sai?

EDIT: Tôi đã sửa lỗi Mozilla Firefox.

+0

tôi sao chép và dán mã của bạn vào firefox , nhưng không có lỗi ... Bạn có thể cung cấp [demo trực tiếp] (http://jsfiddle.net) không? – Dennis

+1

Tôi upvoted chỉ vì dòng "Tôi không muốn jQuery". –

Trả lời

18

Nếu bạn nhìn vào HTML DOM Level 2 Specification, chức năng click() chỉ được xác định cho HTMLInputElement, vì vậy trong khi Safari không thân thiện với người dùng thì không cần thực hiện điều đó.

Cách đúng để kích hoạt một sự kiện cho các trình duyệt hiện đại là trong DOM Level 3 Events:

// First create an event 
var click_ev = document.createEvent("MouseEvents"); 
// initialize the event 
click_ev.initEvent("click", true /* bubble */, true /* cancelable */); 
// trigger the event 
document.getElementById("someElement").dispatchEvent(click_ev); 

Dưới đây là jsfiddle mà làm việc trong Chrome, Safari, Firefox và IE9: http://jsfiddle.net/y5yW9/6/

+0

Tôi đã thử creatEvent này nhưng nó không hoạt động cho IE8 khi bạn đề cập đến. Nhưng những gì tùy chọn khác nếu tôi phải chạy sự kiện này cho IE8 hoặc tùy chọn anyelse. Bởi vì tôi bị mắc kẹt với tình huống này. Cảm ơn bạn nếu bạn sẽ cho tôi câu trả lời –

0

getElementById('enterSearch')

nên document.getElementById('enterSearch')

+0

Tôi chỉ bỏ lỡ nó trên viết lại mã ở đây – Hypn0tizeR

+0

mã thực sự của tôi có 'document.blabla' trong nó và nó không hoạt động – Hypn0tizeR

2

Bạn có đang hiển thị một sự kiện click trên div mà sẽ không có xử lý nhấp chuột tiềm ẩn.

1

Phần tử div không có trình xử lý sự kiện nhấp chuột được xác định theo mặc định. Vì vậy, trước tiên, bạn cần phải áp dụng sự kiện nhấp chuột cho div nhập tìm kiếm, ví dụ: <div id="enterSearch" onclick="submitSearch()">Search</div>. Nếu không, chính nút đó sẽ không thể nhấp được.

Để thực hiện một sự kiện lập trình, sử dụng cấu trúc này:

function pressSearch(e) { 
    if (typeof e == 'undefined' && window.event) { 
     e = window.event; 
    } 

    var charCode = (e.which) ? e.which : ((e.charCode) ? e.charCode : ((e.keyCode) ? e.keyCode : 0)); 
    if (charCode == 13) { 
     var a = document.getElementById('enterSearch'); 

     if (typeof a.onclick == "function") { 
      a.onclick.apply(a); // binds the scope of onclick to a 
     } 
    } 
} 

tôi không thể xác nhận điều này cho IE, nhưng nó hoạt động với Safari.

+0

Điều này sẽ không hoạt động với trình xử lý sự kiện được thêm qua 'addEventListener'. – lqc

+0

Nhưng addEventListener thậm chí sẽ không hoạt động cho IE. Vì vậy, tôi đề nghị cách "cũ" thời trang nếu có thể. Hoặc cách khác, một công tắc IE-Khác phải được chèn vào để gắn kết các sự kiện theo chương trình. – DEAD10CC

+0

Ok, khi sử dụng sự kiện ràng buộc theo chương trình, có vẻ như giải pháp từ Daedalus là chung nhất. Sử dụng nó. – DEAD10CC

3

Safari đang xử lý .click() dưới dạng chưa được xác định là .click() không tồn tại đối với Safari. (Tôi lấy lại điều đó; .click() đang hoạt động đối với tôi. Tôi không biết sau đó: /) Tôi gặp vấn đề tương tự này khi làm việc trên a similar problem. Những gì tôi đã đưa ra, sau một chút về nghiên cứu và như vậy, là như sau để kích hoạt sự kiện nhấp chuột trong safari (cũng như các trình duyệt khác, tất nhiên):

var t = document.getElementById('someidhere'); 
if (document.dispatchEvent) { 
    var o = document.createEvent('MouseEvents'); 
    o.initMouseEvent('click', true, true, window, 1, 1, 1, 1, 1, false, false, false, false, 0, t); 
    t.dispatchEvent(o) 
} else if (document.fireEvent) { 
    t.fireEvent('onclick'); 
} else if (t.click()) { 
    t.click() 
} 

Tôi không biết nếu điều này sẽ làm việc cho bên firefox của bạn về mọi thứ, cho rằng theo @ Dennis, mã của bạn đã hoạt động cho firefox. Nếu không có môi trường để thực sự kiểm tra điều này, tôi sẽ quay trong bóng tối. Tôi hy vọng nó làm việc cho bạn.

+0

Ý của bạn là nếu (t.click()) hoặc nếu (t.click)? –

+0

@PaulBrannan Tôi có thể có nghĩa là 't.click', tuy nhiên, bài đăng này là khoảng 4 tuổi bây giờ, do đó, chỉnh sửa nó sẽ bump nó lên bề mặt, mà không phải là một cái gì đó quá nhỏ. – Daedalus

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