作者wandog (慢跑中毒)
看板Ajax
标题Re: [问题] 启动javascript的连结 via dom
时间Mon Sep 27 11:03:34 2010
※ 引述《sk1765 (鼎玉铉)》之铭言:
: ※ 引述《wandog (慢跑中毒)》之铭言:
: : 各位大大好
: : 最近想要透过dom 来自动登入网页
: : 和点选所要的联结 但是 遇到了一类似下面的联结
: : <a href='javascript:openwnd("argument")' >连结至函数</a>
: : 直接对他使用click这个方法 一点动作都没有
: : 想请教大家都是怎麽处理的 另外 因为这个连结点了之後
: : 会再产生另外一个视窗物件 那又要怎麽透过dom去存取这个物件呢?
: 这个问题要分成三个部分来了解
: 首先我们来分解a href的动作,a是一个连结的tag,href则是这个标记的一个属性,
: 标明他的联结位置href里面写的一段文字是一个通信协定(protocal),
: 通常是http://为开头的http协定
: href这个属性会执行预设动作(default action),他的预设动作是
: 换页并载入新的网址页面(事实上我们不应称之为换页,这个属性的等价动作
: 完全相同於location.href="xxxxxx")
: 所以当我们在浏览器按一个a tag的link会发生什麽事
: 以下是他的流程:
: a. 发生一个click事件 ,如果有click event handler,会执行处理函式
: b. 执行预设动作location.href,也就是执行href属性後面那串文字的
: 如此一来当你要用click取代href时,必须在处理函式中的最後加上
: location.href="xxxxxx")不管你是用传统模式写在分离的.js档案中
: x.onclick = function() {
: .........;
: location.href="xxxxxx";
: }
: 或是行内注册 <div onclick='.........;location.href="xxxxxx";'>aaa</div>
: 都必须在处理函式的最後加上location.href="xxxxxx";
: 所以依原文<a href='javascript:openwnd("argument")' >连结至函数</a>
: 这一列完全等价於
: <div onclick='location.href="javascript:openwnd(\"argument\")";'>
: 连结至函数</div>
: 或是
: <div id="test">连结至函数</div>
: x = document.getElementById('test');
: x.onclick = function() {
: location.href="javascript:openwnd(\"argument\")";
: }
: click 是可以取代href的但是并不是写成
: <div onclick='javascript:openwnd("argument")'>连结至函数</div>
: 因为click是一个event 并没有a tag的预设动作 a href是一个属性他才有预设动作
: 第二 我们来看看 javascript:所代表的意义
: javascript: 是一个虚拟协定(pseudo-protocal)
: 在ppk on javascript(2-c节)一书的中译本中 把它翻做伪协定
: 所谓的虚拟协定表示他不是一个真正的通信协定
: 举例来说http:// , ftp:// 这些则是真正的协定
: 这也意味着在浏览器的网址列你也可以输入javascript:
: 因为他在浏览器看来也是一个协定
: 举例来说 在浏览器网址列打上 javascript:alert('good1');alert('good2');
: 浏览器会出来两个对话框good1,good2 没想到吧
: javascript:xxxxxxxxx xxxxx所代表的文字完全可视为 eval('xxxxx');
: 也就是虽然是虚拟协定 但是他完全可以执行任何的javascript
: xxxxxxx可以是任何javascript 甚至可以读取其他js档中的任何变数和函式
: 至於用<div onclick='location.href="javascript:openwnd(\"argument\")";'>
: 连结至函数</div>
: 代替是不是有不同呢 答案是还是有的
: 为什麽 因为在<a href="javascript:xxxxxxx">
: 其javascript执行的时机已经在预设动作的阶段
: 在这时候已经不能用return false;停止预设动作了 而且click的event早已发生过了
: 第三 我们来看看如何得到popup window 的dom
: 在 openwnd("argument") 这个函式中一定有用到
: var newid = window.open('page.html');
: 所以newid指向新视窗 newid.document就是他的dom
: 你只需要再把这个newid变数传出函式即可利用 或是就直接用window.open吧
: <div onclick='location.href="
: javascript:var newid = window.open(\"page.html\");
: mydom = newid.document;"'>连结至函数</div>
: 但是即便如此在VBA中是否能call url取回document 因为这部分并不了解
: 也许你可以把你的VBA程式贴上来研究一下
: 另外就算能call url ,VBA似乎也不能解译javascript
: 因为javascript: 是一个虚拟协定 要执行该协定的平台一定是能解译javascript的
: 例如浏览器便是 所以首要解决的是VBA如何取得一个简单的html网页的dom
: 先不要考虑popup window 如果可以的话 请把该部分VBA程式码贴上来以供参考
感谢您的回答 我前面的部分可能需要时间吸收一下 我才接触dom和vba不到半个月
之前也只有写过verilog 和一些c for 单晶片
真是不好意思
另外关於pop up出来的视窗 我不是直接用vba去抓资料
我是先透过ie这个浏览器物件去执行这个动作的
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.67.91.220
※ 编辑: wandog 来自: 61.67.91.220 (09/27 11:04)