从另一个文件覆盖JS函数

时间:2013-10-10 16:40:34

标签: javascript override bigcartel

我试图从Bigcartel覆盖JS函数。我无法访问JS文件。

原文是:

updateCart: function(cart) {
    $('aside .cart .count, .main header .cart').htmlHighlight(cart.item_count);
    return $('aside .cart .total').htmlHighlight(Format.money(cart.total, true, true));
  }, 

我正试图将其改为:

updateCart: function(cart) {
  $('aside .cart .count, .sml .cart, .big .cart .count').htmlHighlight(cart.item_count);
  return $('aside .cart .total').htmlHighlight(Format.money(cart.total, true, true));
},

我知道其他人也提出了类似的问题,但在理解如何实施JS时我是一个完整的菜鸟(我只知道如何通过试验和错误进行调整)

如果有任何人可以通过给我答案来帮助我,那将是非常好的。

谢谢,

iWed-


编辑[10.10.13 :: 21:24hr]

为了澄清,我没有直接访问原始JS文件。我只能通过chrome查看它。我只能访问html文件。这是一个大卡特尔主题编辑。

这是使用chrome复制JS的链接。 第216行是代码,如果这有帮助:http://jsfiddle.net/w9GTJ/

2 个答案:

答案 0 :(得分:12)

编辑:你很幸运。从发布的代码中可以看到updateCart方法是在window.Store全局对象上导出的。解决方案是在加载原始脚本后添加此代码:

window.Store.updateCart = function(cart) {
  $('aside .cart .count, .sml .cart, .big .cart .count').htmlHighlight(cart.item_count);
  return $('aside .cart .total').htmlHighlight(Format.money(cart.total, true, true));
};

一般情况说明:

网页中加载的所有脚本都在同一个全局范围内运行,因此覆盖变量就像之后插入脚本一样简单:

<script>
var x = 5; // original script
</script>
<script>
x = 2; // your inserted script
</script>

从它的外观来看,你的函数被定义为一个对象的属性:

var x = {
   updateCart : function(cart) {
     // stuff
   }
}

所以要覆盖它,你需要这样做:

x.updateCart = function(cart) {
  // your code
}

最后,如果原始代码中的函数是私有的,有一种情况你根本无法覆盖它:

function() {
   var x = {
      updateCart: function(){}
   }
}()

// No way to access x.updateCart here

答案 1 :(得分:0)

假设您能够找到并访问相应的js对象:

[theTargetObject].prototype.updateCart= function(cart) {
          $('aside .cart .count, .sml .cart, .big .cart .count').htmlHighlight(cart.item_count);
          return $('aside .cart .total').htmlHighlight(Format.money(cart.total, true, true));
}