2012-03-19 21 views
7

Tôi thích chạy tập lệnh tùy chỉnh trên các trang mà tôi không sở hữu hoặc kiểm soát. Nhiều lần các trang này có nội dung được tạo động mà tôi muốn áp dụng một hàm.Trình xử lý cho các nút DOM được tạo động khi chúng được chèn

Điều này có khả thi không? Nếu vậy, làm thế nào tôi có thể làm điều này? Lý tưởng nhất là tôi đang tìm kiếm một cái gì đó sống phương pháp của live jQuery, ngoại trừ thay vì ràng buộc một sự kiện như click nó sẽ giống như một sự kiện xảy ra khi phần tử được tải trong DOM. load sự kiện sẽ hoạt động đối với một số yếu tố nhưng tôi không nghĩ cho tất cả ...

Đối với câu hỏi này, giả sử bạn không thể xem hoặc thay đổi mã đang chèn các nút DOM. Tôi muốn một kỹ thuật mà tôi có thể sử dụng trong một usercript hoặc bookmarklet có thể được sử dụng trên nhiều trang web không liên quan.

Chỉnh sửa: Tôi đang tìm kiếm một cái gì đó để sử dụng trên các màu sắc nghịch tôi bookmarklet: JavaScript: Invert color on all elements of a page

+0

Bạn muốn áp dụng loại chức năng nào? Bạn có thể nghe sự kiện 'DOMNodeInsertedIntoDocument', nhưng điều này có thể áp dụng cho nhiều nút được chèn vào mà bạn sẽ không quan tâm. – nrabinowitz

+0

Tôi quan tâm đến mọi nút thực sự. Tôi đang thay đổi màu sắc của mọi thứ trên trang. – Muhd

Trả lời

6

Giả sử bạn đang chạy một trình duyệt như Firefox hoặc Chrome, bạn có thể lắng nghe cho sự kiện DOMNodeInserted:

$(document).on('DOMNodeInserted', function(e) { 
    $(e.target).css({ color : '#c00' }); 
}); 

$('body').append('<div>test</div>');​ 

Fiddle: http://jsfiddle.net/VeF6g/ (có thể thất bại trong IE)

+1

Tôi chỉ muốn lưu ý vì lợi ích của người đọc ngẫu nhiên: không sử dụng các sự kiện đột biến nếu bạn có thể tránh nó. Chi tiết: http://lists.w3.org/Archives/Public/public-webapps/2011JulSep/0779.html – Nickolay

+1

@Nickolay - cảm ơn bạn đã tham khảo. Tôi biết đó là một ý tưởng tồi khi sử dụng chúng, nhưng có vẻ hợp lý cho trường hợp sử dụng của OP (trong số những thứ khác, cuộc thảo luận về kịch bản người dùng, vì vậy anh ta sẽ là người duy nhất bị ảnh hưởng bởi chậm hoặc bị treo). – nrabinowitz

1

này là khá khó khăn để thực hiện, bởi vì không có sự kiện khả thi cho phản ứng với những thay đổi DOM. Thay vào đó, tôi thà gắn bó với sự kiện.

Nhưng có một số sự kiện mà bạn có thể thấy hữu ích hoặc thú vị. Trên Mozilla Developer Network's list of DOM events bạn có thể thấy Eg .:

  • DOMNodeInserted,
  • DOMNodeInsertedIntoDocument,
  • DOMNodeRemoved,
  • DOMElementNameChanged,

Tất cả trong số họ tuy nhiên được đánh dấu là dự thảo W3C.

+0

Trình duyệt nào đã triển khai những trình duyệt này? Lý tưởng nhất là tôi muốn một cái gì đó hoạt động trong Chrome. – Muhd

+0

Điểm đánh dấu 'nháp' là một sự giám sát trên một phần của các biên tập viên MDC. Những sự kiện đó cũng có trong các Sự kiện DOML2, đó là "ý tưởng". Thực tế là, hầu hết các sự kiện này hoạt động trên mọi thứ trừ IE; nhưng bạn nên tránh sử dụng chúng, nếu bạn có thể, vì chúng có nhược điểm lớn (chi tiết: http://lists.w3.org/Archives/Public/public-webapps/2011JulSep/0779.html) – Nickolay

1

Cách chung để phát hiện chèn nút là sử dụng sự kiện đột biến DOMNodeInserted.

Tôi quan tâm đến mọi nút thực sự. Tôi đang thay đổi màu sắc của mọi thứ trên trang.

Vì mục đích này, giải pháp tốt hơn là chèn biểu định kiểu động, đủ với cờ !important. Nếu bạn chỉ muốn thay đổi màu sắc, tôi khuyên bạn nên mở rộng Stylish (Stylish for Chrome) thay vì GreaseMonkey.

+0

Phải, nhưng '! lá cờ quan trọng sẽ phá hủy rất nhiều trang. Tôi đang tìm cách tạo một tập lệnh thông minh hoạt động trên nhiều trang khác nhau và có vẻ tốt. – Muhd

+0

@Muhd Bạn có thể chọn bộ chọn thông minh để chỉ chọn các phần tử cụ thể. Phong cách hỗ trợ lựa chọn miền bằng cách sử dụng RegExes thông qua '@ -moz-document regexp()' - Xem thêm ['@ document'] (https://developer.mozilla.org/en/CSS/@document). –

1

Nếu bạn không có truy cập vào một thư viện như jQuery, đây là cú pháp trong only- Javascript:

document.addEventListener('DOMNodeInserted', nodeInsert) 

function nodeInsert() { 
    event.srcElement.style.color = '#ffffff' 
} 

Tôi nghĩ rằng nó sẽ hoạt động trong hầu hết các trình duyệt.

3

Đây là một cách hay để xử lý sự kiện chèn nút. thiết lập hình ảnh động cho các yếu tố mà bạn sẽ thêm bằng cách sử dụng css.

<style type="text/css"> 

/* set up the keyframes; remember to create prefixed keyframes too! */ 

@keyframes nodeInserted { 
from { opacity: 0.99; } 
to { opacity: 1; } 
} 

#parent > button { 
animation-duration: 0.001s; 
animation-name: nodeInserted; 
} 

</style> 

#parent là id cho div, trong đó tôi đang đi để thêm nút của động.

<script type="text/javascript"> 

    var insertListener = function(event){ 
     if (event.animationName == "nodeInserted") { 
      // This is the debug for knowing our listener worked! 
      // event.target is the new node! 
      console.warn("Another node has been inserted! ", event, event.target); 
     } 
    } 

    document.addEventListener("animationstart", insertListener, false); // standard + firefox 
    document.addEventListener("MSAnimationStart", insertListener, false); // IE 
    document.addEventListener("webkitAnimationStart", insertListener, false); // Chrome + Safari 

    setInterval(function(){ 

     var btn = document.createElement("BUTTON"); 

     var t = document.createTextNode("CLICK ME");  // Create a text node 

     btn.appendChild(t);   

     document.getElementById("parent").appendChild(btn); 

    }, 2000); 

</script> 
+0

Tôi đã thực hiện phương pháp này và lập trình một số thay đổi kích thước đáp ứng của 'iframe' bên trong phương thức' insertListener'. Điều kỳ lạ là hành vi thay đổi kích thước tùy chỉnh chỉ xảy ra sau khi cuộn xuống 'iframe', không phải trước đó. Bất kỳ ý tưởng những gì có thể xảy ra ở đây? –