使用JavaScript在HTML小部件中定位动态元素

使用JavaScript在HTML小部件中定位动态元素,javascript,html,Javascript,Html,我试图使用Javascript从页面上的HTML小部件检索元素。我不能只使用通常的document.getelementsbyclassname等,因为小部件被视为页面的嵌入部分 我试过这个: var iframe = document.getElementsByClassName("widgetclassname")[0]; var iframeDocument = iframe.contentDocument || iframe.contentWindow.document; 我过去曾在i

我试图使用Javascript从页面上的HTML小部件检索元素。我不能只使用通常的
document.getelementsbyclassname
等,因为小部件被视为页面的嵌入部分

我试过这个:

var iframe = document.getElementsByClassName("widgetclassname")[0];
var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
我过去曾在iFrame中使用过,但这次没有。我得到了这个错误:

未捕获的TypeError:无法读取未定义的属性“contentDocument”

我尝试过添加延迟和移动项目,以防这是一个时间问题(尝试在正确加载之前获取内容),但没有任何区别


我不能用ID代替类名,因为小部件没有类名,我也不能更改它。

无法读取未定义的属性“contentDocument”
表示“嘿!
iframe
未定义!”,这意味着您的
getElementsByClassName()
正在返回一个空节点列表

如果没有查看您试图查询的文档的方法,我们将无法进一步帮助您。您是否使用开发人员工具来确保所需的
中包含该类?没错,没有打字错误,没有大小写改变

或者,您可以尝试使用:

// first iframe in the document
var iframe = document.querySelector('iframe');

// third iframe in the document
var iframe = document.querySelectorAll('iframe')[2];

编辑:响应我们的聊天讨论,问题是页面正在动态加载内容,而您尝试运行的脚本在加载内容之前发生

一个简单的方法是等待要加载的元素,然后运行所需的代码。例如:

document.title = "Search Results - AvenaGo"; 
var waitForHotel = setInterval(function(){ 
  var hotelName = document.querySelector('.hotel_page-hotel_name'); 
  if (hotelName) { 
    clearInterval(waitForHotel); 
    document.title = hotelName.textContent + ' - AvenaGo'; 
  } 
}, 100);

每隔100ms,此代码将运行并检查是否已加载类为
hotel\u page-hotel\u name
的元素。如果有,它将停止检查,并根据该元素中的文本修改页面标题。

无法读取未定义的属性“contentDocument”
表示“Hey!
iframe
未定义!”,这意味着
GetElementsByCassName()
返回的节点列表为空

如果没有查看您试图查询的文档的方法,我们将无法进一步帮助您。您是否使用开发人员工具来确保所需的
中包含该类?没错,没有打字错误,没有大小写改变

或者,您可以尝试使用:

// first iframe in the document
var iframe = document.querySelector('iframe');

// third iframe in the document
var iframe = document.querySelectorAll('iframe')[2];

编辑:响应我们的聊天讨论,问题是页面正在动态加载内容,而您尝试运行的脚本在加载内容之前发生

一个简单的方法是等待要加载的元素,然后运行所需的代码。例如:

document.title = "Search Results - AvenaGo"; 
var waitForHotel = setInterval(function(){ 
  var hotelName = document.querySelector('.hotel_page-hotel_name'); 
  if (hotelName) { 
    clearInterval(waitForHotel); 
    document.title = hotelName.textContent + ' - AvenaGo'; 
  } 
}, 100);

每隔100ms,此代码将运行并检查是否已加载类为
hotel\u page-hotel\u name
的元素。如果有,它将停止检查,并根据该元素中的文本修改页面标题。

@Phrogz是的,我理解,但我不知道为什么。是不是因为它不是一个实际的iframe?我不知道大量的Javascript…@Phrogz是的,我理解,但我不知道为什么。是不是因为它不是一个实际的iframe?我不知道大量的Javascript…谢谢,但我可以看到页面上肯定至少有一个项目具有该类名,为什么不识别它?感谢您的帮助:)@Lyall如果确实有一个元素具有完全相同的类名(大写),那么我可以想象:(a)您看到的元素位于其他框架或文档中,或者(b)类名被故意用合法但不可见的Unicode字符混淆(尝试从开发人员工具复制/粘贴?)。我可以确认我所针对的元素(div)已复制并粘贴了确切的类名。选项(a)有可能,我会看看我能挖多深。在Chrome中:右键单击,检查元素,查看底部栏中元素的“路径”。等等:a
div
有那个类名吗?div不是iframe。div没有
contentDocument
。谢谢,但我可以看到页面上肯定至少有一项包含那个类名称,为什么不识别它?谢谢你的帮助:)@Lyall如果确实有一个元素具有与类名完全相同的名称(大写),那么我可以想象(a)你看到的元素在其他框架或文档中,或者(b)已故意用合法但不可见的Unicode字符混淆类名(请尝试从开发人员工具复制/粘贴?)。我可以确认我所针对的元素(div)已复制并粘贴了确切的类名。选项(a)是可能的,我会看看我能挖多深。在Chrome中:右键单击,检查元素,查看底部栏中元素的“路径”。等等:a
div
有那个类名吗?div不是iframe。div没有
contentDocument