cxxjackie 发表于 2022-8-10 11:30:23

lucas 发表于 2022-8-10 08:04
感谢大佬指点,作为一个小白,太感谢了,确实解决了我的困扰,之前悬赏的20元,看怎么给方便点,请大佬喝 ...

不用不用,我都不知道有悬赏这回事。

lucas 发表于 2022-8-11 12:57:20

cxxjackie 发表于 2022-8-9 18:06
iframe内部可以理解为另一个网页,如果网页跨域,那无论如何也是不能直接操作其中的元素的。跨域页面可以通 ...

记录一下对这个的理解,还有最后那行return _load.call(this, pdfDocument);没看懂,大佬能再讲下吗?this是指向哪里?pdfDocument是原来函数有的一个属性,哪里来的值传进去的
// iframe内有一个全局对象PDFViewerApplication,可对其进行劫持来判断pdf加载完毕,也可以用其他方法。
    // 1-保存原有函数
    var _load = window.PDFViewerApplication.load;
    // 2-改写原有函数
    window.PDFViewerApplication.load = function(pdfDocument) {
      // 3-在改写后的函数中执行原有函数的逻辑
      // 获取页码数,发送给主页面
      window.top.postMessage({
      numPages: pdfDocument._pdfInfo.numPages
      }, 'https://ctbpsp.com');
      // 4-采用 call 方法劫持,将函数的调用者改为this
      return _load.call(this, pdfDocument);

cxxjackie 发表于 2022-8-11 22:22:48

lucas 发表于 2022-8-11 12:57
记录一下对这个的理解,还有最后那行return _load.call(this, pdfDocument);没看懂,大佬能再讲下吗?thi ...

这句就是调用原函数的意思,this指向PDFViewerApplication,因为load是PDFViewerApplication的一个属性,正常调用PDFViewerApplication.load()的话,函数内的this会指向其所属的对象,而我们保存了_load以后,直接调用_load()的话this会指向window(因为_load不是PDFViewerApplication的属性),这显然是不对的,所以需要人为改变this的指向。下面的例子可以帮助你理解这一点:
const obj = {
    a: 123,
    b: function(n) {
      console.log(this.a + n);
    }
};
const fn1 = obj.b;
const fn2 = obj.b.bind(obj);
fn1(321); // NaN
fn2(321); // 444
pdfDocument参数来自load函数的调用者,网页内部在加载pdf时会自己调用这个load并传参,这个劫持就是在中间把他拦下来,读取我们需要的参数后再原样调用原函数。那句call不仅改变了this指向,也包含了把参数传递回去的操作,如果将其拆分成2步来写,就是这个意思:
const __load = _load.bind(this);
return __load(pdfDocument);

ozon 发表于 2022-8-31 15:08:46

发现一个有用的帖子,记在小本本里{:4_95:}
页: 1 [2]
查看完整版本: 获取iframe中元素,提示跨域访问出错