当前位置: 首页 > 知识库问答 >
问题:

属性更改的断点

暴奕
2023-03-14

Firefox的Firebug有一个很好的特性,叫做“属性更改时中断”,在这里我可以标记任何对象的任何属性,它将在更改之前停止JavaScript执行。

我试图在Google Chrome中实现同样的功能,但在Chrome调试器中找不到该功能。我如何在谷歌浏览器中做到这一点?

共有3个答案

常英纵
2023-03-14

有一个这样的库:BrekOn()

如果将其作为代码段添加到Chrome开发工具(源代码--

要使用它,请打开dev工具并运行代码段。然后要在更改myObject.my属性时中断,请从dev控制台调用:

breakOn(myObject, 'myProperty');

您还可以将库添加到项目的调试构建中,这样您就不必在每次刷新页面时再次调用breakn

梅玉堂
2023-03-14

编辑2016.03:对象。observe在Chrome 50中已弃用并删除

Chrome 36附带本机对象。请注意此处可以利用的实施:

myObj = {a: 1, b: 2};
Object.observe(myObj, function (changes){
    console.log("Changes:");
    console.log(changes);
    debugger;
})
myObj.a = 42;

如果您只是暂时想要它,您应该将回调存储在变量中,并在完成后调用Object.unobserve

myObj = {a: 1, b: 2};
func = function() {debugger;}
Object.observe(myObj, func);
myObj.a = 42;
Object.unobserve(myObj, func);
myObj.a = 84;

请注意,当使用对象时。遵守,当作业没有更改任何内容时(例如,如果您编写了myObj),您将不会收到通知。a=1

要查看调用堆栈,需要在开发工具中启用“异步调用堆栈”选项:

原始答复(2012.07):

一个控制台。观看@katspaugh建议的草图

var console = console || {}; // just in case
console.watch = function(oObj, sProp) {
   var sPrivateProp = "$_"+sProp+"_$"; // to minimize the name clash risk
   oObj[sPrivateProp] = oObj[sProp];

   // overwrite with accessor
   Object.defineProperty(oObj, sProp, {
       get: function () {
           return oObj[sPrivateProp];
       },

       set: function (value) {
           //console.log("setting " + sProp + " to " + value); 
           debugger; // sets breakpoint
           oObj[sPrivateProp] = value;
       }
   });
}

调用:

console.watch(obj, "someProp");

兼容性:

  • 在Chrome20中,您可以在运行时将其直接粘贴到开发工具中
  • 完整性:在Firebug 1.10(Firefox 14)中,您必须将其注入您的网站(例如,如果无法手动编辑源代码,则通过Fiddler);遗憾的是,Firebug定义的函数在调试器上似乎没有中断(或者这是配置问题?请纠正我),但在控制台上。日志起作用
>>> var obj = { foo: 42 }
>>> obj.watch('foo', function() { console.log('changed') })
>>> obj.foo = 69
changed
69

编辑:Object.watch在Firefox 57中被删除。

西门马鲁
2023-03-14

如果您不介意处理源,您可以使用访问器重新定义属性。

// original object
var obj = {
    someProp: 10
};

// save in another property
obj._someProp = obj.someProp;

// overwrite with accessor
Object.defineProperty(obj, 'someProp', {
    get: function () {
        return obj._someProp;
    },

    set: function (value) {
        debugger; // sets breakpoint
        obj._someProp = value;
    }
});
 类似资料:
  • 问题内容: Firefox的Firebug具有一个不错的功能,称为“属性更改中断”,在这里我可以标记任何对象的任何属性,并且它将在更改之前停止JavaScript执行。 我正在尝试在Google Chrome浏览器中实现相同功能,但是在Chrome调试器中找不到该功能。如何在Google Chrome浏览器中执行此操作? 问题答案: 如果您不介意弄乱源代码,则可以使用访问器重新定义属性。

  • 我正在用selenium自动化一个应用程序。没有像id这样的普通标签,我可以通过它找到元素。所以我使用的是xpath[driver.findElement(By.xpath())]。但是现在我发现WebElement的一些XPath在运行时动态变化,所以我的测试用例失败了。甚至相对xpath选项也不适用于HTML。我正在粘贴AUT的html的一部分。请让我知道如何处理这种情况。

  • 简单验证器 向属性添加“验证”例程的快速方法是使用 validates() 装饰者。属性验证器可以引发异常,停止改变属性值的过程,或者将给定值更改为其他值。与所有属性扩展一样,验证程序只由普通的userland代码调用;当ORM填充对象时不会发出验证程序:: from sqlalchemy.orm import validates class EmailAddress(Base): __

  • 问题内容: 我在HTML中创建了一个属性,该属性动态地填充了信息。 有没有一种方法可以检测属性值何时更改? 问题答案: 您将必须注意DOM节点的更改。有一个名为的API,但似乎对其的支持非常有限。这样的答案有一个指向API状态的链接,但是到目前为止,似乎在IE或Opera中都不支持它。 解决该问题的一种方法是让修改属性的代码部分分派一个您可以侦听的事件。 这里的代码是

  • 问题内容: 因此,我最近开始涉足OOP,到目前为止一切进展顺利。虽然我本身没有任何问题,但我希望有一个令人惊奇的功能,尽管我找不到关于该功能的任何文档。 在为对象分配属性时,我经常发现我必须更改依赖于他人的属性,例如光明与黑暗。这是一个例子: 现在,尽管这很酷,但我想要的是相同的过程,但是如果一个属性发生更改,则在同一对象内。如果我重置光的属性(是的),我希望黑暗相应地增加/减少。如果可以更改光的

  • 问题内容: 如何从Java程序外部更改user.home系统属性,使其认为它与D:\ Documents and Settings \%USERNAME%是不同的目录?通过环境变量还是VM参数? 问题答案: 设置VM参数应该起作用: 这是一个测试案例: 在Win XP和Linux上使用Java 1.5.0_17测试