Làm cách nào để bắt buộc lập trình một sự kiện thay đổi trên một đầu vào?


123

Làm cách nào để bắt buộc lập trình một sự kiện thay đổi trên một đầu vào?

Tôi đã thử một cái gì đó như thế này:

var code = ele.getAttribute('onchange');
eval(code);

Nhưng mục tiêu cuối cùng của tôi là kích hoạt bất kỳ chức năng lắng nghe nào và điều đó dường như không hoạt động. Không chỉ cập nhật thuộc tính "giá trị".

Câu trả lời:


142

Tạo một Eventđối tượng và chuyển nó vào dispatchEventphương thức của phần tử:

var element = document.getElementById('just_an_example');
var event = new Event('change');
element.dispatchEvent(event);

Điều này sẽ kích hoạt trình nghe sự kiện bất kể họ đã được đăng ký bằng cách gọi addEventListenerphương thức hay bằng cách đặt thuộc onchangetính của phần tử.


Nếu bạn muốn sự kiện nổi bong bóng, bạn cần truyền đối số thứ hai cho hàm Eventtạo:

var event = new Event('change', { bubbles: true });

Thông tin về khả năng tương thích của trình duyệt:


2
Có, MDN Tạo và kích hoạt các sự kiện là một tài nguyên tốt!
Jakub Holý

1
Đây là cách thực hiện đúng cách, nguyên bản. Hỗ trợ trong tất cả các trình duyệt hiện nay: caniuse.com/#feat=dispatchevent
Willem Mulder

1
Đây là một câu trả lời đúng cho câu hỏi này. Chúng ta phải đạt được điều này theo cách hiện đại.
Константин Ван

1
Tôi đang cố gắng làm điều tương tự trên IE11 nhưng nó không hoạt động khi cố gắng thay đổi trường đầu vào reactjs. var evt = document.createEvent('CustomEvent'); evt.initCustomEvent('input', true, false, { }); elem.dispatchEvent(evt);
Bodosko

3
Tại sao mọi người đều nói đây là câu trả lời tốt nhất? Theo tài liệu Sự kiện được liên kết, ngay cả phiên bản IE hiện tại vẫn không hỗ trợ điều này.
jeff-h

96

Trong jQuery, tôi chủ yếu sử dụng:

$("#element").trigger("change");

2
tihs giúp tôi với! Tôi đang đặt giá trị của hộp kiểm (được chọn hoặc không) bằng cách sử dụng mã và sự kiện hoàn toàn không kích hoạt trong IE cho dù tôi đã làm gì. Tôi đã thử làm mờ () lấy nét () và một vài thứ khác. sau khi tôi đặt giá trị, tôi gọi là trình kích hoạt và tôi cũng đã thêm một sự kiện nhấp chuột vào trình kích hoạt cuộc gọi. Nó gây ra nhiều đám cháy nhưng nó không quan trọng với tôi. Trong IE, tôi thêm các hộp kiểm thông qua mã và bạn phải nhấp vào chúng hai lần trước khi sự kiện thay đổi kích hoạt. Cảm ơn cho mẹo này.
Dustin Davis,

6
Là một bản cập nhật, $ ("# phần tử"). Change (); làm điều tương tự kể từ jquery 1.0.
CookieOfFortune

3
Lưu ý rằng điều này KHÔNG kích hoạt trao đổi gốc. Nó sẽ chỉ kích hoạt trên tất cả các trình nghe onchange đã bị ràng buộc qua jQuery!
Willem Mulder

Bất kỳ giúp đỡ ở đây xin vui lòng? Không có giải pháp nào trong số này có vẻ hiệu quả với tôi .. stackoverflow.com/questions/51216332/…
Gabe

61

ugh không sử dụng eval cho bất cứ điều gì . Chà, có những thứ nhất định, nhưng chúng cực kỳ hiếm. Thay vào đó, bạn sẽ làm điều này:

document.getElementById("test").onchange()

Xem tại đây để có thêm tùy chọn: http://jehiah.cz/archive/firing-javascript-events-properly


3
đánh giá cho việc phản đối JSON;)
Aaron Powell,

3
json2.js để phản đối JSON! JSON.parse đã có sẵn trên các trình duyệt hiện đại
jinglesthula

12
Kỹ thuật này chỉ hoạt động nếu trình xử lý thay đổi được đính kèm bằng cách đặt "onchange". Nó không tạo ra sự kiện 'thực' kích hoạt trình xử lý sự kiện w3c hoặc microsoft. Xem các liên kết để biết thêm chi tiết.
Stephen Nelson

6
Tôi nghĩ câu trả lời này hiện đã lỗi thời , có vẻ như câu trả lời của Miscreant đang sử dụng new Event(...)dispatchEventlà giải pháp phù hợp hiện nay.
Jakub Holý

4
Câu trả lời này đã bị che khuất ; mã trên sẽ không hoạt động nếu bạn đã sử dụng Element.addEventListenerđể xử lý các sự kiện. Để đạt được điều đó theo cách hiện đại, hãy xem câu trả lời của @ Miscreant.
Константин Ван

23

Vì một số lý do ele.onchange () đang ném một lỗi "không tìm thấy phương pháp" cho tôi trong IE trên trang của tôi, vì vậy tôi đã kết thúc sử dụng hàm này từ liên kết Kolten cung cấp và gọi fireEvent (ele, 'change'), hàm này đã hoạt động :

function fireEvent(element,event){
    if (document.createEventObject){
        // dispatch for IE
        var evt = document.createEventObject();
        return element.fireEvent('on'+event,evt)
    }
    else{
        // dispatch for firefox + others
        var evt = document.createEvent("HTMLEvents");
        evt.initEvent(event, true, true ); // event type,bubbling,cancelable
        return !element.dispatchEvent(evt);
    }
}

Tuy nhiên, tôi đã tạo một trang thử nghiệm xác nhận rằng lệnh gọi onchange () hoạt động:

<input id="test1" name="test1" value="Hello" onchange="alert(this.value);"/>
<input type="button" onclick="document.getElementById('test1').onchange();" value="Say Hello"/>

Chỉnh sửa: Lý do ele.onchange () không hoạt động là vì tôi đã không thực sự khai báo bất cứ điều gì cho sự kiện onchange. Nhưng fireEvent vẫn hoạt động.


2
Tôi thích phương pháp phát hiện trình duyệt (bằng cách phát hiện đối tượng) này tốt hơn ví dụ tôi đã cung cấp.
Chris MacDonald

Đây không làm việc nữa cho Firefox 23: "element.dispatchEvent không phải là một chức năng"
Oliver

4
Xin chào các nhân viên Google. Đó là năm 2016! Ngày nay chúng ta viết mã như thế element.dispatchEvent(new Event('change', true, true))thay vì tất cả những gì phức tạp và hầu hết là bị phản đối createEventinitEventcông cụ.
ericsoco

3

Đây là câu trả lời đúng nhất cho IE và Chrome ::

javascript=>

var element = document.getElementById('xxxx');
var evt = document.createEvent('HTMLEvents');
evt.initEvent('change', false, true);
element.dispatchEvent(evt);

2

Lấy từ cuối QUnit

function triggerEvent( elem, type, event ) {
    if ( $.browser.mozilla || $.browser.opera ) {
        event = document.createEvent("MouseEvents");
        event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
            0, 0, 0, 0, 0, false, false, false, false, 0, null);
        elem.dispatchEvent( event );
    } else if ( $.browser.msie ) {
        elem.fireEvent("on"+type);
    }
}

Tất nhiên, bạn có thể thay thế nội dung $ .browser thành các phương pháp phát hiện trình duyệt của riêng bạn để làm cho nó độc lập với jQuery.

Để sử dụng chức năng này:

var event;
triggerEvent(ele, "change", event);

Về cơ bản, điều này sẽ kích hoạt sự kiện DOM thực như thể một cái gì đó đã thực sự thay đổi.


1

Nếu bạn thêm tất cả các sự kiện của mình bằng đoạn mã này:

//put this somewhere in your JavaScript:
HTMLElement.prototype.addEvent = function(event, callback){
  if(!this.events)this.events = {};
  if(!this.events[event]){
    this.events[event] = [];
    var element = this;
    this['on'+event] = function(e){
      var events = element.events[event];
      for(var i=0;i<events.length;i++){
        events[i](e||event);
      }
    }
  }
  this.events[event].push(callback);
}
//use like this:
element.addEvent('change', function(e){...});

thì bạn chỉ có thể sử dụng element.on<EVENTNAME>()đâu <EVENTNAME>là tên sự kiện của mình và điều đó sẽ gọi tất cả các sự kiện với<EVENTNAME>


-2

Để kích hoạt bất kỳ sự kiện nào trong Javascript.

 document.getElementById("yourid").addEventListener("change", function({
    //your code here
})

2
điều này là lắng nghe các sự kiện, không kích hoạt chúng.
'19

-4

nếu bạn đang sử dụng jQuery, bạn sẽ có:

$('#elementId').change(function() { alert('Do Stuff'); });

hoặc MS AJAX:

$addHandler($get('elementId'), 'change', function(){ alert('Do Stuff'); });

Hoặc trong HTML thô của phần tử:

<input type="text" onchange="alert('Do Stuff');" id="myElement" />

Sau khi đọc lại câu hỏi, tôi nghĩ rằng tôi đã đọc những gì phải làm. Tôi chưa bao giờ tìm thấy cách cập nhật phần tử DOM theo cách sẽ buộc một sự kiện thay đổi, điều tốt nhất bạn đang làm là có một phương thức xử lý sự kiện riêng biệt, như sau:

$addHandler($get('elementId'), 'change', elementChanged);
function elementChanged(){
  alert('Do Stuff!');
}
function editElement(){
  var el = $get('elementId');
  el.value = 'something new';
  elementChanged();
}

Vì bạn đã viết một phương thức JavaScript sẽ thực hiện việc thay đổi nên chỉ có 1 dòng bổ sung để gọi.

Hoặc, nếu bạn đang sử dụng khung Microsoft AJAX, bạn có thể truy cập tất cả các trình xử lý sự kiện thông qua:

$get('elementId')._events

Nó sẽ cho phép bạn thực hiện một số thao tác theo kiểu phản chiếu để tìm (các) trình xử lý sự kiện phù hợp để kích hoạt.


1
Tôi tin rằng anh ấy muốn kích hoạt sự kiện thực tế, không chạy một chức năng khi sự kiện được kích hoạt ... tôi nghĩ vậy . lol
Kolten 25/09/08

-5

Sử dụng JQuery bạn có thể làm như sau:

// for the element which uses ID
$("#id").trigger("change");

// for the element which uses class name
$(".class_name").trigger("change");

không xác định không phải là một hàm.
Hristo Venev
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.