2011-03-07 12 views
0

jQueryのイベントハンドラとしてJavaScript関数を使用しようとしていますが、追加の情報が1つ必要です。データを持つオブジェクトに追加しようとしましたが、thisを使用しましたが、thisは実行時にnullです。私はこれが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()); 
} 
関連する問題