【问题标题】:Prototype injection, google maps api原型注入,google maps api
【发布时间】:2011-10-30 18:27:34
【问题描述】:

我需要赶上为google maps autocomplete 取回建议的事件。我知道它是无证的,但做一些研究我发现它可能通过一些原型黑客攻击而被关闭。

<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/(查看控制台)

检查最后两行。当直接在 MVCObject 原型(第一个,评论)上设置“更改”功能时,一切正常,我可以在“捕手”功能中捕捉关键“预测”。问题是,例如,如果我需要在我的页面上有两个自动完成实例,则 catcher 需要有所不同。因此,当我尝试在自动完成的原型链(最后一行)中注入自定义对象时,一切都失败了。有没有办法解决这个问题?

编辑: working version,感谢 Sajid :-)

更新:Completed the code,也许对任何人都有帮助

【问题讨论】:

    标签: javascript google-maps-api-3 function-prototypes


    【解决方案1】:

    在第二行中,您将 MVC 对象的整个原型替换为 MVC 对象的实例,并且根据事物的初始化方式,这可能根本不起作用。第一个 like 替换了一个函数,尽管在此过程中它完全破坏了该函数,因为您没有调用它的超类版本,所以您没有扩展,您真的很糟糕。为了不破坏,你需要这样做:

    (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
    

    因此,如果您的两个版本需要做不同的事情,您可以检查从哪个this 调用更改的方法并做出适当的反应。

    【讨论】:

      猜你喜欢
      • 2014-06-08
      • 2015-11-09
      • 1970-01-01
      • 2014-05-11
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多