2011-03-07 46 views
0

我試圖將JavaScript函數用作jQuery的事件處理程序,但它需要一個額外的信息。我嘗試將它添加到數據的對象中,並使用this,但this在執行時爲空。我相信這與JavaScript中的函數複製有關。我怎樣才能傳遞我的額外信息。將其他參數傳遞給javascript事件

<script type="text/javascript"> 
var WIDTH_ATTR = 'initWidth'; 

function resizeHandler(event, ui){ 
    var change = ui.size.width - this.master.attr(WIDTH_ATTR); 
    this.slave.width(slave.attr(WIDTH_ATTR) - change); 
}; 

function splitResize(master, slave, masterHandles){ 
    var s = new SharedResize(master, slave); 
    master.resizable({ handles: masterHandles, resize: s.resizeHandler }); 
} 

function SharedResize(master, slave){ 
    this.master = master; 
    this.slave = slave; 
    this.resizeHandler = resizeHandler; 
    master.attr(WIDTH_ATTR, master.width()); 
    slave.attr(WIDTH_ATTR, slave.width()); 
} 

// initialise plugins 
$(function(){ 
    try { 
     $('ul.sf-menu').superfish(); 
     splitResize($('#Content'), $('#InfoPanel')); 
    }catch(ex){ 
     alert(ex.message); 
    } 
}); 
</script> 

此代碼當調整大小嚐試給出

 
Line:13 
'this.master' is null or not an object. 

錯誤。

我可以讓這個方案工作,或者有另一種方法將事件處理程序與我的數據相關聯。

回答

1

試試這個變化:

function splitResize(master, slave, masterHandles){ 
    var s = new SharedResize(master, slave); 
    master.resizable({ handles: masterHandles, 
     resize: function(event, ui) { s.resizeHandler(event, ui); } }); 
} 

就這樣,在「調整」處理器將是一個匿名函數,反過來,調用與適當的上下文(「SharedResize」實例)的處理程序。

+0

感謝的作品!我不得不調整你的關閉,但它足夠接近我。我更新了你的答案以反映我的變化。 –

+0

噢好吧 - 我不確定你的意思是什麼「額外參數」的事情:-) – Pointy

+0

我最初的目標是直接將'master'和'slave'傳遞給resize處理程序。我看到我現在可以做到這一點,使用閉包,但對象版本已經寫好。 –

1

您可以做什麼尖尖的建議,或者你可以這樣做:

function SharedResize(master, slave){ 
    this.master = master; 
    this.slave = slave; 
    this.resizeHandler = function(event, ui){ 
     var change = ui.size.width - this.master.attr(WIDTH_ATTR); 
     this.slave.width(slave.attr(WIDTH_ATTR) - change); 
    }; 
    master.attr(WIDTH_ATTR, master.width()); 
    slave.attr(WIDTH_ATTR, slave.width()); 
} 
相關問題