2011-10-30 6 views
1

google maps autocompleteの提案を取り戻すためのイベントをキャッチする必要があります。私はそれが文書化されていないことを知っていますが、いくつかの研究をすることで、プロトタイプのハッキングを介してダウンする可能性があることがわかりました。プロトタイプ注入、google maps api

<input type='text' id='myInput'> 
<script src="http://maps.google.com/maps/api/js?libraries=places&amp;sensor=false&amp;language=en-EN"></script> 
<script> 
function catcher(key) { console.log(key); } 

function MyProto() {} 
MyProto.prototype = new google.maps.MVCObject(); 
MyProto.prototype.changed = catcher; 

var gAuto = new google.maps.places.Autocomplete(
    document.getElementById('myInput'), ['geocode']); 

// one of two should be commented 

//gAuto.__proto__.__proto__.changed = catcher; // every key, including 'predictions' 

gAuto.__proto__.__proto__ = MyProto.prototype; // only 'types', '0', and 'place' when selected 
</script> 

JSFiddleリンク:http://jsfiddle.net/agentcooper/hRyTF/(コンソールを確認してください)

最後の2行を確認してください。 MVCObjectプロトタイプ(最初のコメント付き)で 'changed'関数を直接設定すると、すべてがうまく動作し、 'catcher'関数でキーの '予測'を捕捉できます。問題は、たとえば、私のページにオートコンプリートのインスタンスが2つ必要な場合、キャッチャーが異なる必要があるということです。オートコンプリートのプロトタイプチェーン(最後の行)にカスタムオブジェクトを挿入しようとすると、すべてが失敗します。これを解決する方法はありますか?

EDIT:working version、Sajid :-)

UPDATEのおかげ:Completed the codeは、多分それは2行目誰

答えて

1

に参考になる、あなたは全体のプロトタイプを交換しますMVCオブジェクトのインスタンスを持つMVCオブジェクトで、どのように初期化されるかによって、これはまったく機能しない可能性があります。最初のようなものが1つの関数を置き換えますが、そのプロセスではスーパークラスのバージョンを呼び出さないのでその関数を完全に破るので、拡張していないので、本当に壊れてしまいます。壊しないように、あなたがする必要があります。

(function() { 
    var oldChanged = gAuto.__proto__.__proto__.changed; 

    function catcher(key) { 
     // call old version, and make sure to maintain this reference correctly 
     oldChanged.call(this, key); 
     // do your stuff here 
    } 

    gAuto.__proto__.__proto__.changed = catcher; 
})(); 

一つの簡単な解決策は、各オブジェクトは、上記のthisのアイデアを持っているということです。したがってchangedには、thisへの参照があります。これは、呼び出し元のターゲットとして使用されているオブジェクトを参照します(ここでは範囲外です)。しかし、基本的には:

var x = new MVCObject(); 
x.changed('hi') // this === x 

は、だからあなたの2つのバージョンが異なることを行う必要がある場合は、変更されたメソッドが呼び出されるから、適切に反応した this確認することができます。

+0

ありがとうございます!作業バージョンへのリンクを追加しました – spacevillain