2012-07-20 14 views
0

Tiddlywiki에 대해 일종의 탭 인터페이스를 만들고 있는데,이 코드를 tiddler가 열리거나 닫힐 때마다 호출하는 방법을 궁금합니다. Tiddlywiki는 브라우저에서 실행되는 HTML 노트 유형이며, Tiddler는 #tiddlerDisplay의 div입니다. 한 번에 하나 이상이있을 수 있으며 대개 하나 이상 있습니다.문서에서 요소를 추가하거나 제거 할 때 어떤 이벤트가 발생합니까?

목록에 포함하려는 div는 #tiddlerDisplay이고 목록 자체는 jQuery("#mainMenu > #singleTiddlerList")입니다.

config.macros.singleTiddler.update = function(){ 
    jQuery("#mainMenu > #singleTiddlerList").empty(); 
    jQuery("#tiddlerDisplay > div").each(function(i,e){ 
     jQuery("#mainMenu > #singleTiddlerList").append(jQuery(
      createTiddlyButton(document.createElement("li"),jQuery(e).attr("tiddler"),"",config.macros.singleTiddler.clickHandler) 
     ).parent()); 
    }); 
}; 

업데이트 : 현재 코드 외부에서 그것을 할 수 없다면 난 그냥, 사용자 정의 이벤트를 추가 할 수 없습니다 (예 : 문서로드에 발생 일 등).

+1

제거/추가 작업을 수행하고 이벤트 응답을 되돌릴 수 있도록 트리거하는 bind()를 사용하여 맞춤 이벤트를 만드는 방법은 어떻습니까? – Panagiotis

+0

열기 및 닫기를 수행하는 코드를 제어 할 수 없으며이를 덮어 쓰지 않으려합니다. 플러그인에서이 작업을 수행 할 수 있습니까? –

+0

답변을 드리겠습니다. 아래를 참조하십시오. – Panagiotis

답변

0

편도는 jQuery("#tiddlerDisplay").bind("DOMSubtreeModified", config.macros.singleTiddler.update);이지만 Chrome (Opera 또는 Safari 일 가능성이 있음)에서만 작동하며 사용하지 않는 것으로 보입니다 .Firefox에는 이브의 듀오가 있습니다. 동일한 일을 성취하기 위해 nts하지만, 나는 또한 이것들 역시 사용되지 않을 것이라고 생각한다. 이벤트가 발생 후 꼬마의 개폐 것을

(function($, oldRem){ 
    Story.prototype.displayTiddler = function(){ 
     var resp = oldRem.apply(this, arguments); 
     $("#tiddlerDisplay").trigger("displayTiddler"); 
     return(resp); 
    }; 
})(jQuery, Story.prototype.displayTiddler); 
(function($, oldRem){ 
    Story.prototype.closeTiddler = function(){ 
     var resp = oldRem.apply(this, arguments); 
     $("#tiddlerDisplay").trigger("closeTiddler"); 
     return(resp); 
    }; 
})(jQuery, Story.prototype.closeTiddler); 
jQuery("#tiddlerDisplay").bind("displayTiddler", config.macros.singleTiddler.update); 
jQuery("#tiddlerDisplay").bind("closeTiddler", config.macros.singleTiddler.update); 

주의 사항 :

내가 this article을 읽고 티 들리 위키 소스 코드를 탐험 후 발견하는 또 다른 방법이있다. 또한 기사에서 알 수 있듯이 jQuery는 동일한 방식으로 도청 될 수 있지만 기본 DOM 메서드에 대해서는 알지 못합니다. 의심 스럽습니다. 관계없이 모든 사람들이 그것들을 버리고 jQuery를 사용해야합니다!

+1

내 두뇌는 이것이 열리는 모든 가능성으로 경주하고 있습니다!1 년 전 나는 이것을 정확히 원했다. 때로는 무언가를 파악할 수 없을 때가 얼마나 놀라운 지, 그리고 나중에 다시 돌아올 때, 그저 그런 종류의 오류가 발생하는 것을 놀라게합니다. –

+0

이것이 오버라이드 (override)라고 불리는 지 모르겠지만, 나에게 잘 맞습니다. 나는 그것을 덮어 쓰는 다른 플러그인을 조심해야만한다. 나는이 방법을 도청이라고 부른다. –

0

먼저 div 추가/삭제에 대한 두 개의 맞춤 이벤트를 만듭니다. 위에 게시 된 코드를 사용하는 문서에 바인딩하도록합니다. 코드의 변화 그리고

jQuery(document).bind('div-removed',function(e){ 
    // code stuff to do for removal 
    jQuery("#mainMenu > #singleTiddlerList").empty(); // required 
    // other stuff here 
}); 
jQuery(document).bind('div-appended',function(e){ 
// code stuff to do on append 
     jQuery("#tiddlerDisplay > div").each(function(i,e){ 
      jQuery("#mainMenu > #singleTiddlerList").append(jQuery(
       createTiddlyButton(document.createElement("li"),jQuery(e).attr("tiddler"),"",config.macros.singleTiddler.clickHandler) 
      ).parent()); 
     }); // required 
    //other stuff here 
}); 

약간 실행 :.

config.macros.singleTiddler.update = function(){ 
    $(document).trigger("div-removed"); 
    $(document).trigger("div-appended"); 
}; 

그것은 확실히가 업데이트 유일한 방법 (지금 생각 그것은 또한 .promise()와 함께 할 수 있지만 그것이 시작이다 갱신 아니다

+0

첫 번째 트리거는 모든 div가 제거되거나 div가 제거 될 때만 실행됩니까? –

+0

잠깐, 나는 오해가 여기에 있다고 생각한다. 중독자는'# tiddlerDisplay'에 있고 그 목록은'# singleTiddlerList'에 있습니다. 이를 반영하기 위해 질문을 업데이트했습니다. 편집하고 싶지 않은 코드는'# tiddlerDisplay'에서 div를 추가하고 제거하는 코드입니다. –

+0

아마도 [this] (http://api.jquery.com/delegate/)가 도움이 될 것입니다. 어쩌면 당신은 위임이 필요합니다. – Panagiotis