Ⅰ HTML如何阻止事件冒泡求源码分析
原以为span不同于input,事件冒泡会被父级标签吞噬,写了个测试事件冒泡的Demo,发现并不是想得那样。另外:event.stopPropagation()以及event.stopImmediatePropagation()并不能阻止span冒泡到a标签中,而简单粗暴的return false却可以。
1<!DOCTYPEhtml>
2<html>
3<head>
4<title>Bubbling</title>
5<styletype="text/css">
6*{
7font-size:30px;
8}
9div{
10border:1pxbluesolid;
11}
12span{
13border:1pxbluesolid;
14}
15</style>
16<scripttype="text/javascript">
17functionsetforeColor(sender){
18sender.style.color="red";
19}
20
21functionsetbgColor(sender){
22sender.style.background="green";
23returnfalse;
24}
25</script>
26</head>
27<body>
28<div>
29<spanonclick="setforeColor(this)">spantag</span>indiv
30</div>
31<br>
32<div>
33<inputtype="button"value="Button"onclick="setforeColor(this)"/>indiv
34</div>
35<br>
36<ahref="https://www..com"style="text-decoration:none;display:block;">
37<spanonclick="setforeColor(this);returnfalse">spantag</span>inanchor
38</a>
39<br>
40<ahref="https://www..com"style="text-decoration:none;display:block;">
41<spanonclick="setbgColor(this)">spantag</span>inanchor
42</a>
43</body>
44</html>
Ⅱ 急求java代码的详解析 bt_9.setOnClickListener(new OnClickListener(){ public void onClick(View v){ str
Button19.setOnClickListener(new View.OnClickListener() {//添加一个OnClickListener接口的匿名实例/对象
public void onClick(View v) {//当click事件发生时会调用这个onclick方法
// TODO Auto-generated method stub
if (str_result!=""){//1:判断字符串是否与空串常量的内存地址相同,凡是在源代码中出现的"xxxxx",统统属于全局静态常量。字符串比较千万别用“==”“!=”。
double b = Double.parseDouble(str_result);
//2:把str_result的字符串转为double类型的数据
str_result = ""+b*b;
//3:把str_result设为b的平方。""+<数值型> ——〉转为字符串类型
entry.setText(String.valueOf(str_result));
//4:把entry的显示文字设为str_result,也即原来的输入的数字的平方。String.valueOf用得有点多余。
}
}
}
//以下的看来是对上面那段毛病代码的修正。
if(str_oper.equals("*")){//对代码1的修正,这才是判断字符串内容是否相同。
g=Double.parseDouble(str_display.toString());//跟代码2一个意思,只是转换的对象是一个字符串缓冲区里的字符串。这里不明白为什么要使用字符串缓冲区。
str_result=String.valueOf((b*g));
//等价于代码3。两者都对。
entry.setText(str_result);
//等价于代码4。
str_display=new StringBuffer("");
//为str_display开辟一个新的字符串缓冲区。字符串缓冲区的作用是避免每一次字符串拼接修改都得new一个字符串对象。这里是干吗用的,由于没看到完整程序,不清楚。
Ⅲ javascript调用数组的问题
第一页:第四课介绍
对于Java script来说有两个主要部分:该语言本身及其目
标库。在第2课介绍的语法中,我们已经研究了变量,语句
和if-then子句,这些是所有程序设计语言的组成部分。现在来
学习Java script语法的其余部分。
对于Java script语法来说,我们仅剩下三个问题需要学习:
循环、数组和函数。
让我们从循环开始。
第二页:循环介绍
有时你想反复做同一件事。你想向某些人询问一个口令,你不
断地问,直到得到正确的口令。如果你只想给他们两次尝试的
机会,你可以这么做:
var the_password = "pass the wrench";
var answer = prompt("What's the woyd?","");
if (answer != the_password) {
answer = prompt("What's the woyd?","");
if (password != the_password) {
document.write("You lose!<p>");
} else {
document.write("That's right!<p>");
}
} else {
document.write("That's right!<p>");
}
不幸的是如果你想不住地问直到得到正确答案,上述做法是不
起作用的。假使你是想询问四次而不是两次,那这已经是很讨
厌的事了。你将使用四个层次的if-then 子句,这决不是件好事。
反复做相似的事情的最好方法是使用一个循环(loop)。在这种
情况下,你可以用一个循环来不断的要求口令直到这个人说出
为止。这里有一个while循环工作的例子,口令是:pass the
wrench。
第三页:循环的密码
那就是密码!
让我们逐行地来研究这个例子,如果你想看整个答案,可以查看源码。
在这个典型的Java script序言之后,我们从双变量申报开始:
var password="pass the wrench";
var answer;
这里我们定义该密码作为一个字符串,我们申报一个称为
answer的变量。你将理解为什么我们不得不立即申报一
个answer。下面几行是非常重要的:
while (answer != password)
{
answer = prompt("What's the woyd?","");
}
这是一个while循环。while 循环的一般格式为:
while (some test is true)
{
do the stuff inside the curly braces
}
上述几行表明:“当answer不等价于Password时,执行提示
命令。”这一循环将持续地执行波形括号内的语句直至测试
失败。在使用者输入的单词与密码一致(即Pass the wrench)的
情况下,测试必将失败。
由于在对一个未申报的变量执行一个如(answer!=password)的
测试时,在某些浏览器上会产生错误,所以我们必须申
报answer。由于在while循环中将通过提示方案对answer赋值,
在我们第一次进行循环中,answer将没有数值。提前定义它并
设定其处始值为“”。
由于不定义循环经常地使用,循环经常用来执行一组语句某一
特定的次数。这里用另一个循环来演示如何作这项工作。
第四页:再谈WHILE循环
我们已见到了很多所请求的X`S,现在复习一下:
第一步:请求X`S的数目
var width = prompt("How many x's would you like? (1-10 is
good)","5");
下一步,申报一些变量:
var a_line="";
var loop = 0;
现在,关键之处:
while (loop < width)
{
a_line = a_line + "x";
loop=loop+1;
}
即说:“当变量循环小于所请求的X`S行宽时,在该行加入另一
X然后在循环值上加1。”该循环将继续加一X到该行并在循环值
上加1直到循环不在小于请求的行宽。请看下列源码分析:
第一次
a_line = "" (because we initialized it to be "")
loop=0 (because we initialized it to be 0)
width=2 (because that's what the user asked for)
0 is less than 2 so
a_line = a_line + "x", so now a_line = "x"
loop=loop+1, so now loop = 1
返回循环:第二次
loop=1
width=2
a_line = "x"
1 is less than 2 so
a_line = a_line + "x", so now a_line = "xx"
loop=loop+1, so now loop = 2
返回循环:第3次
loop=2
width=2
a_line = "xx"
2 is NOT less than 2 so
fall out of the loop and do what follows
随后是:
alert(a_line);
启动一个警告对话框。
这种循环运用的如此普遍以至于程序员们开发了一些简便
方式,条件循环可写成这样:
while (loop < width)
{
a_line += "x"; //this was a_line = a_line + "x";
loop++; //this was loop=loop+1;
}
首行,“x”,表示“本身加x”。若已有a_number=5,那么可
写成,a_number+=3,即是说:a_number=a_number+3。程序员
就是这么偷懒的。
下行,loop++,意味着“自身加1”。于是loop++即为:
loop=loop=1。它也可写成loop+=1。这样偷懒行为非常有效。
就象不止一种方式在一个数上加1一样,也有不止一种方法来写
一个循环。While循环不是唯一的循环模式,另一流行的循环
是for循环。
第五页:For循环
上例中while循环可以写成如下形式:
var a_line="";
var loop = 0;
while (loop < width)
{
a_line = a_line + "x";
loop=loop+1;
}
也可用For Loop写成:
var a_line="";
for (loop=0; loop < width; loop++)
{
a_line = a_line + "x";
}
for循环的格式为:
for (initial value; test; increment)
{
do this stuff;
}
这样,上述for loop设置loop=0并持续加1直到loop<width,这
和上例中while loop相同,仅是少了数行而已。都表示
“在a_line上加width次x”。
在我们练习使用循环之前应明白一件事:循环可以嵌套。这里
有一个关于嵌套循环的例子。
第六页:嵌套循环
这是程序:
var height = prompt("How high do you
want the grid? (1-10 is good)","10");
var width= prompt("How wide do you want
the grid? (1-10 is good)","10");
var a_line;
var new_window =
window.open("/webmonkey/98/04/files1a
/grid.html","looper","width=400,height=400");
new_window.document.writeln("<h1>A Grid</h1>");
for (height_loop = 0; height_loop
< height; height_loop++)
{
a_line = "";
for (width_loop = 0;
width_loop < width; width_loop++)
{
a_line+="x";
}
new_window.document.writeln
(a_line + "<br>");
}
在请求高及宽后,打开一新窗口,并为它写一个头,进入for
循环。第一个for循环设a_line=“”。试一下不用该行做一下
本例,看看会发生什么。在初始化a_line后,程序进入下一个
for循环,当宽达到所需值后,建立X`S行并将它显现在新窗
口中。这些将发生height次。
好,现在你的任务:看一下这个循环练习并亲自试着在看源码
前写一个。
第七页:循环练习
循环练习程序要求一些字然后反向显示。试着自己写一下程
序,再看源码了解其原理。问题不大了吧,现在开始学习数组。
第八页:数组
我们已了解变量可是数字、字符串及对象参数。还有一个
Javascript的重要部分:数组。
数组是一种列表。各种列表比如名单、URL以颜色列表都可以存
储在数组中。
这里我们生成颜色的数组:
var colors = new Array("red","blue","green");
现在你就有了一个数组,你能对它做什么呢?数组的优点在于
数组中的各个元素可以通过数字调用。第一个元素的数字是0,
可以用以下方式调用:
var the_element = colors[0];
执行这一行JavaScript指令时,变量the_element所被赋予的值
是字符串"red" 。通过写出数组的名称并将数组中元素的顺序号
放在方括号内就可调用数组中的该元素。数组中第2个元素的顺
序号是1。
一旦生成数组后,你可以添加和修改数组值。如果你打算将颜
色数组的第1个元素有红色该为紫色,你可以这样做:
colors[0] = "purple";
数组经常用于循环。下文将讲数组和循环的应用。
第九页:数组和循环
数组是一项非常有用的东西,因为你可以循环调用数组中的各
个元素执行某项功能。以下是循环显示一个URL数组中的各个元素
的例子。
首先,要使该例子发挥作用,我们需要声明一些变量:
var url_names = new Array("hits.org","awaken.org","bianca.com");
var a_url;
接下来,我们循环调用数组中的各个元素,打开每
个URL并对待用户点击alert框的OK按钮:
for (loop = 0; loop <url_names.length; loop++)
{
// make the name of a url, for example http://www.hits.org/
a_url = "http://www." + url_names[loop] + "/";
// open a window
var new_window=open(a_url,"new_window","width=300,height=300");
// wait for the click
alert("hit ok for the next site");
}
首先,你会注意到循环从0一直到url_names.length这个变量。
将.length放在数组名的后面由于告诉你数组中有多少个元素。
但是,注意数组元素的数目同数组最后一个元素的索引号(顺
序号)不同。如果数组中有3个元素,则数组的长度为3,但是
数组中最后一个元素的索引号却是array[2].。这是因为数组中
第1个元素的索引号是array[0].。如果你执行数组调用时得到
诸如"object not found" 的错误信息,而你的代码中有一个
数组,则有可能是因为你将数组元素的索引号同数组中元素的
数目混淆了。
不也许还会注意到将.length放在数组的结尾处很有点想给一个
对象附加一些属性。这是因为数组本身就是对象,而length就
是数组的一项属性。
数组术语对象的另一个表现是:你需要用新指令才能生成新的
数组。在上例中,url_names = new Array(......) 实际可以
解释为:生成一个新数组,用url_names对其做一个引用。你可
以注意到单词"new" 以这种方式被应用时,就生成了一个新的
对象。
循环中的第1行生成一个变量。其赋值为一个字符串。
a_url = "http://www." + url_names[loop] + "/";
循环开始时,变量循环的初始值为0。url_names数组的第1个元
素是字符串"hits.org".,所以在第一次循环中,变量a_url等
值于字符串"http://www.hits.org/".。
循环的下一行用该URL打开一个窗口
var new_window=open(a_url,"new_window","width=300,height=300");
由于每次打开窗口时我们给窗口起的名称都一样,所以在转到
新的URL时,不会打开许多窗口。如果我们在上例中去掉窗口
名称"new_window",则每次循环时就会打开一个新窗口。
循环的第3行只是打开一个alert框,并对待用户点击OK 按钮。
数组还可以由于其它元素,而不只是字符串。数组可以应用
于JavaScript文件对象模块(Document Object Model)的各个
方面。>>
第十页:文件目标模块中的数组
下面是onClick=""链接中的代码:
var change=prompt('Change which image (0 or 1)?','');
window.document.images[change].src='three.jpg';
本例打算用图片交换来演示数组如何介入DOM的。如果你用的
是IE3.0或Netscape2.0,赶紧升级。试一下本例,看一下源码。
document.image_name.src = 'some_image.gif';
为了做这事,每个图片都需命名到。若你不知要交换的图片
名,但却知道其在HTML页中的顺序。可以用它的DOM数来指定该
图片。
一个HTML文件中的第一个图片是document.images[0],第二个
是document.images[1],如此类推。若你想知道一个文件中有
多少个图片,你可检查图片数组长度知道:
document.imageslength。例如,你想改变你的网页中所有图形
为一个Spacer GLF图片,你可以这样做:
for (loop = 0; loop < document.images.length; loop++)
{
document.images[loop].src = 'spacer.gif';
}
清楚了吧?
好。下面我们准备三步是函数。函数学习中,我们要做一些
练习,并有一些作业。
进入函数学习课程。
第十一页:函数
函数是编程需学的最后一个基本组成。所有的程序语言都是
函数。函数是一些角次可调用的、无须重写的东西。
如果你想教会自己快速阅读并且用一个一旦点击可告诉你当前
时间的长文本链接。
例如…时间!
看源码:
<a href="#" onClick="
var the_date = new Date();
var the_hour = the_date.getHours();
var the_minute = the_date.getMinutes();
var the_second = the_date.getSeconds();
var the_time = the_hour + ':' + the_minute + ':' + the_second;
alert('The time is now: ' + the_time);">time!</a>
在这里这段JavaScript的工作细节并不重要;一会我们再回来
复习一下。
重要的是它太长了。若这些时间链接再有10个,你须每次剪贴
这段程序。这使你的HTML既长且难看。另外,若你想改变这段
程序,就必须在10个不同地方改变。
你可以写一个函数来执行而不用作10次拷贝程序。这里的函数
使用变的即容易编辑又容易阅读。
请看如何写一段计时函数。
第十二页:无参数函数
该HTML页含有一个叫做announceTime的函数。从一个链接调用
annoumnceTime:
<a href="#" onClick="announceTime();">time!</a>
就象这样:
下行看起来就象第二课:
<a href="#" onClick="alert('Hello!');">Hello!</a>
这称为从一个链接调用警告对话框。函数就象一种方法,唯一不
同的是,方法依附于一个对象。在这个警告的例子中,这个对象
是一个窗口对象。
让我们回到函数本身。如果你看看源码,你将看到函数位于HTML
文件的头部中。
<html>
<head>
<title>Function with No Parameters</title>
<script langauge="JavaScript">
<!-- hide me
function announceTime()
{
//get the date, the hour, minutes, and seconds
var the_date = new Date();
var the_hour = the_date.getHours();
var the_minute = the_date.getMinutes();
var the_second = the_date.getSeconds();
//put together the string and alert with it
var the_time = the_hour + ":" + the_minute
+ ":" + the_second;
alert("The time is now: " + the_time);
}
// show me -->
</script>
</head>
<body>
...
</body>
</html>
好,让我们逐行复习这个函数。首先,所有函数来自于该种格式:
function functionName(parameter list)
{
statements ...
}
函数的命名规则于变量差不多。第一个字符必须是字母或一标准符
号。其余字符可为数字或一横线。但必须保证函数不于已定义的变
量同名。否则将出现很糟糕的结果。我是用内部大写的方式命名函
数以保证它们不与字符碰巧重名。
函数名后是一组参数。本例是无参数的函数,下一例中我们再举例
描述。
参数后是函数的主体。这是一组当函数调用后是想运行的语句。在
下面几个例子中,我打算利用这个报时器,所以让我描述一下它是
怎样工作的。
第一行:
var the_date = new Date();
取得一个新的日期对象。就象你在用数组时取得一个新的数组一
样,在你要找出即时是什么时间时你需要先取得一个日期对象。
当找到了一个新的日期对象,它自动重置到当前的日期和时间。
为了在对象以外得到这个信息,你必须使用这种对象方法:
这些方法从日期对象上取得了合适的数字。
var the_hour = the_date.getHours();
var the_minute = the_date.getMinutes();
var the_second = the_date.getSeconds();
你可能疑惑:我怎样能假定日期对象知道何种方式?甚或我如何
知道有这样一件事可作为日期对象?这些缘由应从Javascript
库中获取,我将尽我所能解释内置Javascript对象,但不一定能
彻底的使你清楚。
函数的其他部分就很清楚了。它以这种方式调用返回数字,把它
们变成字符串,并且调用警告方式以弹出一个字符串对话框。注
意你可以在函数内部调用一个方式和函数。我们将详尽讨论。
现在如果你也玩透了时间链接,你可能注意到了有些什么不对的
事。你每次可能会得到这样的反馈:“12:12:04”,这是
getSecond()将返回值为“4”。那么当你合成为时间时,你看到
的就是the_minute+“:”+the_second得到14:4而非是我们想要
的。解决它是个容易的事,需要个新的函数来修补分、秒合成值。
请看参数及返回值。
第十三页:参数及返回值
尽管无参数的函数在减少写源码工作量,HTML源码可读性上很
有用,但有参数的函数会更为有用。
上一例中,当返回的分、秒值小于10时会有问题发生。我们想
要看到的秒值是04而非4。我们可以这样做:
var the_minute = the_date.getMinutes();
if (the_minute < 10)
{
the_minute = "0" + the_minute;
}
var the_second = the_date.getSeconds();
if (the_second < 10)
{
the_second = "0" + the_second;
}
它会非常有效。但是注意,同样的源码你写了两次:若某件
东西小于10,则前面加“0”。所以要考虑当用同一代码要多
次重写时,用函数来做。本例中我写了一个叫fixNumber的函数:
function fixNumber(the_number)
{
if (the_number < 10)
{
the_number = "0" + the_number;
}
return the_number;
}
fixNumber的参数是the_number。一个参数也是一个变量,当该
函数被调用时,其参数值也被设置。在本例中,我们这样调用
函数:
var fixed_variable = fixNumber(4);
参数the_number在函数中设置为4。到现在你应该对fixNumber
的主体有了一定的了解。它的意思是:如果变量the_number小
于10,则在它的前面加一个0。这里面新的内容是return指令:
返回the_number的值。在下面的情况中就会用到return指令:
var some_variable = someFunction();
变量some_variable的值是函数someFunction() 的返回值。
在fixNumber中,我加入: return the_number,则退出函数并
将返回the_number的值返回给任何一个等待被设置的变量。
所以,我这样书写代码:
var fixed_variable = fixNumber(4);
the_number的初始值将通过函数调用被设置为4,然后由于4小
于10,所以the_number将被改为"04"。然后the_number值被
返回,而且变量fixed_variable将被设置为"04" 。
为了将fixNumber包括在原始函数announceTime()中,我添加了
如下内容:
function announceTime()
{
//get the date, the hour, minutes, and seconds
var the_date = new Date();
var the_hour = the_date.getHours();
var the_minute = the_date.getMinutes();
var fixed_minute = fixNumber(the_minute);
var the_second = the_date.getSeconds();
var fixed_second = fixNumber(the_second);
//put together the string and alert with it
var the_time = the_hour + ":" + fixed_minute + ":" + fixed_second;
alert("The time is now: " +the_time);
}
假定时间链接被点击时,时间为12:04:05。用new Date()获得
日期,用getHours()获得小时,用前面所属方法获得分钟,分
钟在本例中应该是4, 然后调用fixNumber,其参数为the_minute:
var fixed_minute = fixNumber(the_minute);
当fixNumber()被调用时,参数the_number被设置为the_minute。
在本例中由于the_minute是4,所以the_number将被设置为4。
设置完参数后,我们进入函数主体。由于4小于10,the_number
被改变为"04",然后the_number值用return指令返回。当"04"
被fixNumber返回后,本例fixed_minute就等于"04"。
我们一步一步来研究该过程。假定时间为12:04:05。
我们从函数announceTime()开始
the_minute = the_date.getMinutes();则the_minute = 4
fixed_minute = fixNumber(the_minute);等于函
数fixNumber()并将其值返回给fixed_minute
现在进入函数fixNumber()
函数fixNumber(the_number)fixNumber()用the_minute的
值调用,the_minute值是4,所以现在the_number = 4
如果(the_number < 10) {the_number = "0" +
the_number;}由于4小于10,所以the_number现在等于"04"
返回the_number值,退出该函数并返回值"04"
现在已经退出函数fixTime(),所以现在我们回
到announceTime()
该函数返回值为"04",所以fixed_minute 现在等于"04"
该例用了一个只有一个参数的函数。实际上你可以为函数
设置多个参数。例如该函数输入两个数组并返回一个元素
列表。
第十四页:多于一个参数的函数
这是我定义的一个数组:
var monkeys = new Array("mattmarg","wendy",
"kristin","tim","aaron", "luke");
var kittyphile = new Array("wendy", "ruby",
"roscoe", "tim");
var discophile = new Array("mattmarg",
"john travolta", "wendy");
var happy = new Array("tim", "wendy",
"stimpy", "aaron");
var cranky = new Array("ren", "mattmarg","luke");
随着这些数组的定义,arrayIntersect函数给出,我们可轻
而易举的发现那些网猴酷爱迪斯科:爱跳舞的网猴
注意到尽管John Travolta喜爱迪斯科,但他不在monkeys请
单中,则他就不是只爱跳舞的网猴为调用该函数值,可这么来:
<a href="#" onClick="arrayIntersect('dancing
monkeys',monkeys,discophile);">dancing monkeys</a>
这是个具有3个参数的函数:一个代表交叉的姓名,第一个数组,
及第二个数组。这也很容易发现爱猫的网猴名爱猫的网猴。
看一下源码:
<a href="#" onClick="arrayIntersect('monkeys who love
cats',monkeys,kittyphile);">cat-loving monkeys</a>
让我们看看arrayIntersect函数本身:
function arrayIntersect(intersect_name, array_1, array_2)
{
var the_list = "";
for (loop_1 = 0; loop_1 < array_1.length; loop_1++)
{
for (loop_2 = 0; loop_2 < array_2.length; loop_2++)
{
if (array_1[loop_1] == array_2[loop_2])
{
the_list = the_list + array_1[loop_1] + " ";
}
}
}
alert("the " + intersect_name + " are: "+ the_list);
}
看看你是否已经弄懂本例中的循环。关键是函数第一行:
function arrayIntersect(intersect_name, array_1, array_2)
这里定义了一个叫arrayIntersect的函数,它有3个参数。就象上
例,每个参数就象一个变量,当函数调用时赋值。因此,当函数被调
用时:
arrayIntersect('dancing monkeys',monkeys,discophile);
下列分配:
intersect_name = 'dancing monkeys'
array_1 = monkeys
array_2 = discophile
唯一需注意的是,你必须以正确的参数数目来调用函数。如果你一旦
象这样调用arrayIntersect:
arrayIntersect(monkeys,discophile);
将会出错。试一下看会发生什么错误。
在任一标准的Javascript程序中,函数都是基本的部件。因此理解其
工作原理极其重要。这里是一个测试你对这项工作理解多少的练习。
再综合地做一下本课中其它练习,再在你自己的浏览器中应用。
Ⅳ Java htmlunit click 方法点击没反应怎么回事
解决思路如下:
第三个tr点击的时候其实是有反应的 是有向服务器请求数据的 不过不知道为啥htmlunit没有给我做修改页面代码的操作 不过既然有发request 那就会有response 既然有response response里就一定有我要的数据
首先先:
MainService.page = subGroup.getValue().click(); //模拟点击 向服务器发送请求 用一个HtmlPage对象接着
WebResponse res = MainService.page.getWebResponse(); //获取最近请求的响应
String html = res.getContentAsString(); //将响应变为字符串
接下来变为字符串之后 就可以做想做的操作了 因为我只是要一个URL地址 所以 接下来我做了切割字符串的操作 得到我要的url
int endNum = html.indexOf(subGroup.getValue().asText()); //操作字符串 拿到url
String str = html.substring(0, endNum);
int beginNum = str.lastIndexOf(URL的特有起始字段);
String str2 = html.substring(beginNum, endNum);
int buffer = str2.length()-str2.indexOf("\"");
String url = html.substring(beginNum, endNum-buffer);
因为网页代码的缘故 我有一些特别的操作 不过上面几行代码就是从response里获得url的过程 这个过程要根据网页的不同具体分析的
接下来只要将得到的url送给getPage方法就能得到正常的页面了
MainService.page = wc.getPage(url);
Ⅳ 按键精灵 获取网页按钮.click后生成的源码
无刷新加载了些源码,是因为网页采用的是 Ajax 技术,使用 Javascript 动态获取服务器的返回信息,然后写入网页之中。
想要获取这一段源码,那就只有执行这一段 JS 代码,否则只是获取网页源码是静态的。
执行 JS 解析一般用 Chrome 的 V8 引擎,这在 PHP、Node.js 等脚本语言中广泛使用,至于 VB,,因该也是没问题的,毕竟那个引擎是开源的。
但我觉得还是算了吧,还是换一个方式解决问退:
1、按键精灵创建一个浏览器窗口,鼠标模拟点击,然后鼠标模拟复制操作,获取数据。
2、网页版按键精灵,直接调用 IE 解析网页,也可以使用自带的 Plugin.Web.RunJS 命令直接运行 Javascript 语句,直接返回需要的数据。
================
希望我的回答对你有帮助!
Ⅵ jquery $('#btn').click与$("#btn").live("click",function()有什么区别
1、延时绑定事件功能不同:
jquery $('#btn').click在文档流中,后续通过脚本动态添加的元素(符合 id="#btn"),是没有绑定click事件的。
$("#btn").live("click",function()后续通过脚本动态添加的元素(符合 id="#btn"),也是绑定了click事件的。如何使用 live() 方法向尚未创建的元素添加事件处理器。
live()可以将事件绑定到当前和将来的元素(eg:为id=zy元素绑定点击事件,而当用js动态生成一个节点并插入到dom文档结构中时,如果是用bind()绑定的,怎么新插入的节点将不会有该bind绑定事件。而live()则可以);
2、绑定方式不同:
.live()则是通过冒泡的方式来绑定到元素上的。更适合列表类型的,绑定到DOM节点上。而click()是直接绑定在元素上。
3、底层API支持不同:
click()方法:在jqeury事件处理API中,bind()是其API基础。click(),mouseover(),mousermove等来处理事件,真正起作用的是bind()。而这些方法都只是辅助作用(别名函数),简化使用。都只有一个参数(触发事件时执行的回调函数)。live()不同,不依赖bind()API。
Ⅶ 用javascript的click()方法 能模拟点击这个“<div id="go">用户登录</div>“
可以直接调用click,示例如下:
<html>
<head>
</head>
<body>
<inputtype="button"onclick="FangFa()"value="事件"id="btn"/>
</body>
</html>
<scripttype="text/javascript">
functionFangFa()
{
alert("你单击了按钮");
A=newLei();
A.HanShuA();
}
document.getElementById("btn").click();
</script>
还有的话,直接调用click所引用的函数也是可以的
Ⅷ 如何触发jquery.nestable树节点的click事件
从源码来看, 绑定在树节点的click事件, 会因为先触发内部的onmousedown, 调用dragStart方法而导致原DOM节点被移除, 继而导致click事件无法触发;
这里在不修改源码的前提下提供两个方案:
1. click事件换成mousedown事件
2. 通过对源码onStartEvent方法的分析, 在树节点上放一个button将树节点的"拖拽开始"和"点击事件"分离(注意这里的button需要不同于nestable自己的折叠按钮的样式设定)
举个栗子:
<!DOCTYPEhtml>
<htmllang="en">
<head>
<metaname="author"content="sleest">
<metaname="description"content="nestableexampleforitemclick,2017/08/23">
<title>Document</title>
<metacharset="utf-8">
<style>
.dd{
position:relative;
display:block;
list-style:none;
line-height:1.5;
}
.dd-list{
display:block;
position:relative;
padding:0;
list-style:none;
}
.dd-list.dd-list{
padding-left:2rem;
}
.dd-collapsed.dd-list{
display:none;
}
.dd-item,
.dd-empty,
.dd-placeholder{
display:block;
position:relative;
min-height:20px;
line-height:1.5;
}
.dd-handle{
display:block;
height:30px;
margin:5px0;
padding:5px10px;
border:1pxsolid#ccc;
background:#fff;
box-sizing:border-box;
-moz-box-sizing:border-box;
}
.dd-handle:hover{
color:#2ea8e5;
}
/*注意这里只设置nesttable自带折叠按钮的样式*/
.dd-item>button[data-action]{
display:block;
position:relative;
cursor:pointer;
float:left;
width:25px;
height:20px;
margin:5px0;
padding:0;
text-indent:100%;
white-space:nowrap;
overflow:hidden;
border:0;
background:transparent;
font-size:12px;
line-height:1;
}
/*注意这里只设置nesttable自带折叠按钮的样式*/
.dd-item>button[data-action]:before{
content:'+';
display:block;
position:absolute;
width:100%;
text-align:center;
text-indent:0;
}
.dd-item>button[data-action="collapse"]:before{
content:'-';
}
.dd-placeholder,
.dd-empty{
margin:5px0;
padding:0;
min-height:30px;
background:#f2fbff;
border:1pxdashed#b6bcbf;
box-sizing:border-box;
-moz-box-sizing:border-box;
}
.dd-empty{
border:1pxdashed#bbb;
}
.dd-dragel{
position:absolute;
pointer-events:none;
z-index:9999;
}
.dd-dragel>.dd-item.dd-handle{
margin-top:0;
}
.dd-dragel.dd-handle{
-webkit-box-shadow:2px4px6px0rgba(0,0,0,.1);
box-shadow:2px4px6px0rgba(0,0,0,.1);
}
</style>
</head>
<body>
<divclass="dd">
<olclass="dd-list">
<liclass="dd-item"data-id="1">
<divclass="dd-handle">Item1</div>
<buttonid="btn-demo"style="position:absolute;top:0;right:0;">AButton</button>
</li>
<liclass="dd-item"data-id="2">
<divclass="dd-handle">Item2</div>
</li>
<liclass="dd-item"data-id="3">
<divclass="dd-handle">Item3</div>
<olclass="dd-list">
<liclass="dd-item"data-id="4">
<divclass="dd-handle">Item4</div>
</li>
<liclass="dd-item"data-id="5">
<divclass="dd-handle">Item5</div>
</li>
</ol>
</li>
</ol>
</div>
<scriptsrc="https://cdn.bootcss.com/jquery/3.2.1/jquery.slim.js"></script>
<scriptsrc="https://cdn.bootcss.com/Nestable/2012-10-15/jquery.nestable.js"></script>
<script>
functionsomeEvent(event){
console.log(this,event.type);
}
$('.dd').nestable();
$('body').on('mousedown','.dd-item',someEvent);
$('body').on('click','#btn-demo',someEvent);
</script>
</body>
</html>
结果:
Ⅸ android TV开发焦点移动源码分析
点可以理解为选中态,在Android TV上起很重要的作用。一个视图控件只有在获得焦点的状态下,才能响应按键的Click事件。
相对于手机上用手指点击屏幕产生的Click事件, 在TV中通过点击遥控器的方向键来控制焦点的移动。当焦点移动到目标控件上之后,按下遥控器的确定键,才会触发一个Click事件,进而去做下一步的处理
在处理焦点的时候,有一些基础的用法需要知道。
首先,一个控件isFocusable()需要为true才有资格可以获取到焦点。如果想要在触摸模式下获取焦点,需要通过setFocusableInTouchMode(boolean)来设置。也可以直接在xml布局文件中指定:
keyEvent 分发过程:
而当按下遥控器的按键时,会产生一个按键事件,就是KeyEvent,包含“上”,“下”,“左”,“右”,“返回”,“确定”等指令。焦点的处理就在KeyEvent的分发当中完成。
首先,KeyEvent会流转到ViewRootImpl中开始进行处理,具体方法是内部类 ViewPostImeInputStage 中的 processKeyEvent :
接下来先看一下KeyEvent在view框架中的分发:
这里也是可以做焦点控制,最好是在 event.getAction() == KeyEvent.ACTION_DOWN 进行.
因为android 的 ViewRootlmpl 的 processKeyEvent 焦点搜索与请求的地方 进行了判断if (event.getAction() == KeyEvent.ACTION_DOWN)
• 首先ViewGroup会一层一层往上执行父类的dispatchKeyEvent方法,如果返回true那么父类的dispatchKeyEvent方法就会返回true,也就代表父类消费了该焦点事件,那么焦点事件自然就不会往下进行分发。
• 然后ViewGroup会判断mFocused这个view是否为空,如果为空就会return false,焦点继续往下传递;如果不为空,那就会return mFocused的dispatchKeyEvent方法返回的结果。这个mFocused其实是ViewGroup中当前获取焦点的子View
发现执行了onKeyListener中的onKey方法,如果onKey方法返回true,那么dispatchKeyEvent方法也会返回true
如果想要修改ViewGroup焦点事件的分发
• 重写view的dispatchKeyEvent方法
• 给某个子view设置onKeyListener监听
下面再来看一下如果一个页面第一次进入,系统是如何确定焦点是定位在哪个view上的
由于DecorView继承自FrameLayout,这里调用的是ViewGroup的requestFocus
descendantFocusability:
• FOCUS_AFTER_DESCENDANTS:先分发给Child View进行处理,如果所有的Child View都没有处理,则自己再处理
• FOCUS_BEFORE_DESCENDANTS:ViewGroup先对焦点进行处理,如果没有处理则分发给child View进行处理
• FOCUS_BLOCK_DESCENDANTS:ViewGroup本身进行处理,不管是否处理成功,都不会分发给ChildView进行处理
因为 PhoneWindow 给 DecoreView 初始化时设置 了 setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS),所以这里默认是FOCUS_AFTER_DESCENDANTS
到此第一次请求焦点的过程基本告一个段落
焦点移动的时候,默认的情况下,会按照一种算法去找在指定移动方向上最近的邻居。在一些情况下,焦点的移动可能跟开发者的意图不符,这时开发者可以在布局文件中使用下面这些XML属性来指定下一个焦点对象:
在KeyEvent分发中已经知道如果分发过程中event没有被消耗,就会根据方向搜索以及请求焦点View
流程一:查找用户指定的下一个焦点
流程二:获取搜索方向上所有可以获取焦点的view,使用算法查找下一个view
addFocusables() 获取搜索方向上可获得焦点的view
descendantFocusability属性决定了ViewGroup和其子view的聚焦优先级
• FOCUS_BLOCK_DESCENDANTS:viewgroup会覆盖子类控件而直接获得焦点
• FOCUS_BEFORE_DESCENDANTS:viewgroup会覆盖子类控件而直接获得焦点
• FOCUS_AFTER_DESCENDANTS:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
addFocusables 的第一个参数views是由root决定的。在ViewGroup的focusSearch方法中传进来的root是DecorView,也可以主动调用FocusFinder的findNextFocus方法,在指定的ViewGroup中查找焦点。
FocusFinder.findNextFocus 查找焦点