2013-02-28 71 views
1

如何獲得已放置到可放置目標上的jQuery小部件的上下文?jQuery droppable越來越被丟棄的對象上下文

例如這是可拖動與此代碼的插件:

In the code that makes the images be draggable 

ContentImageHolder.prototype = { 

    options: { 
     contentInfo: null, 
    }, 

    getContentInfo: function(){ 
     return this.options.contentInfo; 
    }, 

    makeContentDraggable: function(){ 

     $(this.element).draggable({ 
      revert: true, 
      scroll: false, 

      start: $.proxy(this, 'dragStart'), 
      stop: $.proxy(this, 'dragStop'), 
     }); 
    }, 

    _init: function() { 
     this.makeContentDraggable(); 
    } 

$.widget("basereality.contentImageHolder", ContentImageHolder); 

然後這是我的代碼,使垃圾可以接受的圖像。

TrashCan.prototype = { 

    trashContent: function (event, ui){ 
     //What do I do here to be able to access the functions of the dropped object 
     //droppedObject.getContentInfo(); 
    }, 

    _init: function() { 
     $(this.element).droppable({ 
      drop: $.proxy(this, 'trashContent'), 
     }); 
    }, 
} 
$.widget.bridge('trashCan', TrashCan); 

是否有可能得到的是被拖到可放開,所以我可以在對象上調用函數的ContentImageHolder的背景下?

在這裏所有的問題與類似的關鍵字都說使用ui.draggable但引用一個DOM對象,而不是jQuery小部件。那麼是否有可能獲得jQuery小部件?

回答

1

無論何時您有一個已經初始化了jQuery小部件或UI元素的DOM對象,您都可以通過您用來創建它的函數來訪問小部件或UI元素的函數和屬性。

通過這一點,我的意思是,如果你想調用.getContentInfo(),那麼你可以做這樣的:

trashContent: function (event, ui){ 
    // Set a property of contentImageHolder 
    $(ui.draggable).contentImageHolder("option", "contentInfo", "something") 

    // Access a method of contentImageHolder 
    $(ui.draggable).contentImageHolder("getContentInfo"); 

    // Do whatever.... 
}, 

注:根據什麼類型的對象ContentImageHolder的是,你可能要申報它是這樣的:

ContentImageHolder = { 

    options: { 
     contentInfo: null, 
    }, 

    getContentInfo: function(){ 
     return this.options.contentInfo; 
    }, 

    makeContentDraggable: function(){ 

     $(this.element).draggable({ 
      revert: true, 
      scroll: false, 

      start: $.proxy(this, 'dragStart'), 
      stop: $.proxy(this, 'dragStop'), 
     }); 
    }, 

    _init: function() { 
     this.makeContentDraggable(); 
    } 
} 

IE:不要如果沒有適當的改變原型,或者你可能最終爲你的函數的地方,他們不屬於,像所有對象。

欲瞭解更多信息,請查看jQuery的窗口小部件廠文檔:http://api.jqueryui.com/jQuery.widget/

希望幫助!

== ==編輯 如果你不知道將要刪除的對象的類型,但你要調用一個共同名稱的函數,那麼最簡單的方法我能想到的做將只是一個參數添加到物體的像這樣的jQuery的數據:

// Inside ContentImageHolder._init() : 
$(this.element).data("basereality.type", "contentImageHolder") 

這將允許你檢查你的拖動處理程序中的類型:

trashContent: function (event, ui){ 
    // Get its type like this: 
    var elemType = $(ui.draggable).data("basereality.type"); 

    // Call the getContentInfo function 
    $(ui.draggable)[elemType]("getContentInfo"); 

    // Do stuff 
}, 

然後你只需要確保val 「basereality.type」中的ue與jQuery下的初始化函數的名稱相同。

+0

謝謝。如果我知道什麼類型的對象將被拖放到可拖放對象上,那很好用。但是,如果可以刪除多種類型的小部件,您如何獲得對象類型?即如何知道我可以調用$(ui.draggable).contentImageHolder(「getContentInfo」);而不是像$(ui.draggable).contentVideoHolder(「getContentInfo」);如果它是一個被刪除的視頻小部件。 – Danack 2013-02-28 07:11:04

+0

btw感謝您對代碼結構的建議。我實際上使用了小部件橋接,並遵循了這裏的建議:http://www.erichynds.com/jquery/using-jquery-ui-widget-factory-bridge/(沒有完全理解它的每一部分) 。 你知道,如果在原型上定義函數實際上並不需要嗎? – Danack 2013-02-28 07:14:12

+0

不客氣。查看我的編輯來確定類型。至於你的結構,如果這個對象是一個函數(如果你按照你所關聯的教程,它應該是),那麼使用.prototype是正確的方法,因爲它允許使用'this'關鍵字。此外,如果「getContentInfo」和/或其他函數是常見的,你可能想檢查一下窗口部件中的繼承:http://msdn.microsoft.com/en-us/library/hh404085.aspx#sec25 – 2013-02-28 14:10:01