2012-04-16 31 views
10

Có thể nghe TẤT CẢ các sự kiện của một sự kiện cơ bản nếu các sự kiện là các không gian tên không?jQuery: ràng buộc các không gian tên sự kiện

Ví dụ:

$elmt.bind("change", function (event) { 
    console.log(event); 
}); 
$elmt.trigger("change.namespace1"); 
$elmt.trigger("change.namespace2"); 

này chỉ hoạt động nếu tôi liên kết với các tên sự kiện đầy đủ nhưng đây là những gì tôi không biết về vị trí này :(

+0

chính xác bạn đang cố gắng làm gì? – Evan

+0

Trình cắm thêm jquery kích hoạt các sự kiện thay đổi không gian tên (change.channel, change.selected và các sự kiện khác). Tôi muốn thực hiện một hành động nếu một trong những sự kiện thay đổi đã được kích hoạt. Tôi không wont để mã cứng tất cả các không gian tên có thể. –

+0

Chỉ cần xem qua câu hỏi của bạn sau khi tôi đăng [mỏ] (http://stackoverflow.com/questions/12590231/bind-to-all-namespaces-of-custom-jquery-event). Tôi cũng muốn biết nếu điều này là có thể. – jschr

Trả lời

1

Bạn có thể, nhưng nó không hoàn hảo.

Ví dụ:.

function eventHandler(event){ 
    $("#output").html($("#output").html() + "<br />" + event); 
} 

$elmt = $("#elmt"); 
$elmt.bind("change.namespace1", eventHandler); 
$elmt.bind("change.namespace2", eventHandler); 

$elmt.trigger("change.namespace1"); 
$elmt.trigger("change.namespace2"); 

JSFiddle is here

Bạn cần trích xuất không gian tên từ sự kiện và bật mặc dù cả hai không gian tên được kích hoạt cho sự kiện "thay đổi" cơ bản, điều này có nghĩa là bạn chỉ cần sử dụng không gian tên "chỉ" hoặc không có không gian tên.

Tôi hy vọng điều này sẽ giúp ích một chút.

1

Cross-đăng tải từ Bind to all namespaces of custom jquery event


Hãy thử triggerAll thay vì trigger:

(function($) { 
    $.fn.triggerAll = function(topics, data, delimiter) { 
     return this.each(function() { 
      var $this = $(this), chain = [], t = ''; 
      delimiter = (delimiter || '.'); 
      // rebuild chain 
      $.each(topics.split(delimiter), function(i,n) { 
       t += (i == 0 ? '' : delimiter) + n; 
       chain.push(t); 
      }); 

      // append/prepend original topic? 
      data = (data || []); 
      data.push(topics); 
      $.each(chain, function(i,t) { 
       $this.trigger(t, data); 
      }); 
     }); 
    }; 
})(jQuery); 

Cấp, do cách xử lý jQuery kích hoạt không gian tên, kích hoạt các "gốc" sự kiện thực sự bắn các phiên bản namespaced , để có được những gì bạn mong đợi, bạn cần sử dụng một ký tự khác cho dấu phân cách, như / và sau đó khai báo các sự kiện của bạn như:

var $o = $('#whatever'); 
// this will be triggered for all events starting with 'root' 
$o.on('root', function() { console.log(Array.prototype.slice.call(arguments, 0)); }); 
// some arbitrary way to fire custom events 
$o.on('click', function() { 
    $o.triggerAll('root/custom1/subA', ['1st', '2nd'], '/'); 
    $o.triggerAll('root/custom2', [3, 4, 5], '/'); 
}); 
+0

Rất tiếc ... không hoàn toàn đúng. một giây. – drzaus

+0

được cập nhật để phù hợp với bài đăng gốc. – drzaus

0

Đây là những gì tôi đã sử dụng để so sánh chủ đề đang tồn tại trên mỗi phần tử li và thay thế bằng chủ đề tùy chỉnh mới .....

$('li').each(function(index) { 
        var oT = $(this).attr('data-theme'); 
        var li_item = $(this).attr(index); 

        $('#li_item ').mousedown(function() { 

         if(oT=='a') 
         { 
          $(this).removeClass('ui-btn-up-' + a').addClass('ui-btn-up-' + 'c').attr('data-theme', 'c'); 
         } 

        }); 

        $('#li_item ').mouseup(function() { 


         if(oT=='c') 
         { 
          $(this).removeClass('ui-btn-up-' + 'c').addClass('ui-btn-up-' + 'a').attr('data-theme', 'a'); 
         } 

        }); 

});

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