如何.__ defineGetter__可用于检测浏览器中的控制台是否已打开

时间:2016-04-03 21:08:12

标签: javascript

我一直在阅读the source code here,它会检测控制台何时打开,如果是,则会播放音频元素。

我对一些事感到困惑。

首先,我无法弄清楚它是如何检测控制台是否已打开。

if( audioCheck === true || (window.Firebug && window.Firebug.chrome && window.Firebug.chrome.isInitialized)) {
   play();
}

以下行返回undefined,因此audioCheck === true触发play()函数。

window.Firebug && window.Firebug.chrome && window.Firebug.chrome.isInitialized

以下行将audioCheck设置为true。我对__defineGetter__做了一些研究,但对我来说仍然不清楚。

audioElement.__defineGetter__('id', function() {
   audioCheck = true;
});

任何人都可以解释这是做什么的吗?经过多次研究,我无法弄明白。

最后完全抛弃我的是,如果我删除此行,则音频不会播放:

console.log("Check the console: ", audioElement);

这真的很奇怪,虽然这应该只将信息记录到控制台,并且对声音是否播放没有任何影响,但我想这必须与{{1}重新绑定}

这里有很多问题,所以任何可以解决这些问题的亮点都会受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

我不知道确认这个 1 的任何来源,但很可能你遇到的行为是现代浏览器的影响。控制台通常会这样做 - 如果您发出var RespSchema = new mongoose.Schema({ surveyResponseId : {type: mongoose.Schema.Types.ObjectId, ref: 'SurveySResponsechema', required: true, index : true}, customerSurveyId : {type: mongoose.Schema.Types.ObjectId, ref: 'CustomerSurveySchema', required: true, index : true}, version : Number, question : Number, responseType : String, // single or multiple-choice not implemented response : [String], responseNum : [Number], created_dt : { type: Date, default: Date.now } var SurveyResponseSchema = new mongoose.Schema({ customerSurveyId : {type: mongoose.Schema.Types.ObjectId, ref: 'CustomerSurveySchema', required: true, index : true}, deviceId : String, // whch Android Tableet is runing this version : Number, taken : Boolean, created_dt : { type: Date, default: Date.now } }); mongoose.model('SurveyResponse', SurveyResponseSchema); mongoose.model('Resp', RespSchema); var Resp = mongoose.model('Resp'); var SurveyResponse = mongoose.model('SurveyResponse'); Resp.find({created_dt: {"$gt": new Date("2016-03-31T09:20:00Z")}}) .sort('customerSurveyId' ) .populate('SurveyResponse') .exec(function(err, results) { if (err) return err; console.log('results is:', JSON.stringify(results)); }); 并传递HTML元素作为其参数,控制台将尝试显示其详细信息,例如ID。并且console.log()行确保当浏览器访问ID时,调用伪getter函数(__defineGetter__只是一种非标准的设置方法 - 或替换 - 对象 2 )。相当聪明,不是吗?

1 可能需要对各种浏览器的源代码进行分析才能完全理解并验证问题。
2 在MDN上阅读有关getter的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get(请注意,标准方法,如其中所述,是致电__defineGetter__())。