2014-02-06 56 views
0

这很容易在古典HTML如何使用javascript导航获取页面上的所有链接?

$('a').map(function(){return this.href}).toArray()

但是,如果导航是通过JavaScript的东西像做:

<a href='#' onclick='someFn()'>Some link</a>

这是不可能知道的网址不执行该someFn功能,如果你执行它 - 它不会返回URL,而是将页面导航(我无法控制someFn函数,不知道里面是什么或者如何改变它)。

因此,为了从页面获得所有N个链接,您必须加载所有这N个页面。这是非常缓慢和低效的。

如何解决?

可能的解决方案 - 如果有可能拦截对window.location的呼叫 - 解决问题。您只需点击所有这些链接并检查window.location的值,而无需加载新页面。但我不知道这是否可行(我使用phantomjs,看起来它不能这样做)。

注意

有HTML中没有URL时,执行的JavaScript即使经过。是的,在某些情况下,您可以使用浏览器模拟器执行JS,然后解析浏览器中动态生成的HTML。但它不是这样的,我用的浏览器模拟器(phantomjs),但即使JS执行,所有导航纯JS完成的,与

<a onclick=tonsOfWeirdBlackBoxFunctionsYouCantChange>

+0

你想要归档那个东西?可能还有另一种方法可以做到这一点。例如,YOu可以解析链接的整个代码,无论它们出现在哪个上下文中。 –

+0

基本上,我需要访问一些网站的网站,我不能访问所有的网站,因为有太多。如果它是我需要访问的页面,我可以通过URL进行检测。我需要获取URL列表来分析并选择要访问的URL(不加载所有内容)。 –

+0

因此,解析源代码寻找任何看起来像URL的东西是没有问题的,对吧?忽略上下文。这仍然不会给你动态创建的URL,但是如果不执行JavaScript,则不可能。 –

回答

1

后没有在HTML URL &导航如果你试图解析一个已经在网页上执行过的源代码,你需要使用正则表达式来对这些URL进行字符串搜索。

如果您试图在运行时解析位置代码并将它们保存到数组或其他东西---每个函数中的每个对象都有一个toString函数。

也就是说---如果你定义functions作为对象:

//Although you should really be using a parameter for this... 
//...I'm trying to hold context with your use case. 
var redirectToContact = function(){ 
    window.location = "/contact.html"; 
} 

您可以redirectToContact.toString(),并在运行正则表达式的功能:

Mabye类似:

var url = redirectToContact.toString(); 
console.log(url.match('window.location = "(.*)";')[1]); 
+0

即使在执行JS之后,HTML中也没有URL。而且,我无法访问代码,也无法更改它。 –

+1

@AlexeyPetrushin如果您可以在浏览器中运行代码,则可以访问它。此时,您可以在平面文件上运行正则表达式函数---或者使用无头浏览器运行代码并拦截HTTP事务以派生“未知”URL名称。 –

+0

“”“那时你可以在一个平面文件上运行正则表达式函数”“”有20k +的JS行,其中有导航代码放在这里和那里。至于拦截HTTP电话 - 谢谢,聪明的想法,我需要检查它! –

相关问题