火车采集器软件交流官方论坛

 找回密码
 加入会员
搜索
火车采集器V9版免费下载火车浏览器 - 可视采集,万能群发,全自动脚本工具
楼主: faunus

ChinaStock全程解析

[复制链接]
 楼主| 发表于 2008-12-10 23:15:08 | 显示全部楼层
-  108   function chinastock_detail_sTrendImg(type){
-  109     var curStock = gZealChinaStock.m_stock_list[detailPosToDealNow];
-  110     type = type || 'min';
-  111     ElE('csk-detail-trendimg').src = 'http://image.sinajs.cn/newchart/'+type+'/n/'+curStock.m_sFixid+'.gif?'+(new Date()).getTime();
    112 }

http://image.sinajs.cn/newchart/min/n/sz000960.gif?1228922353165
 楼主| 发表于 2008-12-10 23:27:21 | 显示全部楼层
-  245     gZealChinaStock.m_ajaxRequest.open( "GET", 'http://hq.sinajs.cn/format=js&list='+curStock.m_sFixid+','+bigStocks.join(',') );
B  246     gZealChinaStock.m_ajaxRequest.setRequestHeader( "User-Agent", "Mozilla/4.0 (compatible; FirefoxExtensions CSK1.0; Windows XP 5.1)" );
-  247     gZealChinaStock.m_ajaxRequest.setRequestHeader("X-Requested-With", "XMLHttpRequest");
-  248     gZealChinaStock.m_ajaxRequest.send( null );

var stockpattern = new RegExp('var hq_str_'+curStock.m_sFixid+'="([^"]+)";','g')

http://hq.sinajs.cn/format=js&list=sz000960,s_sh000001,s_sz399001,s_sz399106,s_sh000300

var hq_str_sz000960="锡业股份,13.45,13.62,13.64,13.73,13.00,13.64,13.65,14125844,189541907.87,16018,13.64,32850,13.63,14800,13.62,46010,13.61,77700,13.60,54472,13.65,32700,13.66,17525,13.67,36200,13.68,58000,13.69,2008-12-10,15:05:58";
var hq_str_s_sh000001="上证指数,2079.117,41.377,2.03,1282510,9307744";
var hq_str_s_sz399001="深证成指,7490.289,129.300,1.76,9785444,988818";
var hq_str_s_sz399106="深证综指,624.331,14.141,2.32,17803610,4096815";
var hq_str_s_sh000300="沪深300,2096.393,55.546,2.72,832710,7075138";

var infolist = gZealChinaStock.m_ajaxRequest.responseText.split("\n").join("").split("\r").join("").split(';');
infolist =
"var hq_str_sh600036=\"\u62DB\u5546\u94F6\u884C,14.17,14.40,14.09,14.20,13.78,14.06,14.09,54791076,768929403,23900,14.06,45500,14.05,16700,14.04,51600,14.03,2900,14.02,37200,14.09,17197,14.10,50200,14.11,18300,14.12,53943,14.13,2008-12-11,10:41:38\";var hq_str_s_sh000001=\"\u4E0A\u8BC1\u6307\u6570,2070.440,-8.677,-0.42,466383,3465264\";var hq_str_s_sz399001=\"\u6DF1\u8BC1\u6210\u6307,7517.133,26.844,0.36,3508844,371780\";var hq_str_s_sz399106=\"\u6DF1\u8BC1\u7EFC\u6307,624.146,-0.185,-0.03,4274145782,1521579\";var hq_str_s_sh000300=\"\u6CAA\u6DF1300,2088.735,-7.658,-0.37,286379,2540317\";"

[ 本帖最后由 faunus 于 2008-12-11 12:51 编辑 ]
 楼主| 发表于 2008-12-13 18:00:47 | 显示全部楼层

chinastock.xul

chrome://chinastock/content/chinastock.xul
 楼主| 发表于 2008-12-13 18:05:24 | 显示全部楼层
<stringbundleset id="chinastock-stringbundleset">
        <stringbundle id="chinastock-bundle" src="chrome://chinastock/locale/chinastock.properties"/>
    </stringbundleset>

   XUL 提供的 stringbundle 元素
  • 在 content 文件夹中,用文本编辑器打开 overlay.js 文件。你可以看到下面这样一段代码,它在变量中定义了一个确认对话框。
var bConfirmed = window.confirm("Welcome to Hello World! Click OK to continue.");
我们希望可以把对话框中的文本“Welcome to Hello World! Click OK to continue.”放到语言包中去,那样就可以把它翻译成其他语言,从而实现脚本文件的本地化。
  • 在 en-US 文件夹中新建文本文件,重命名为“overlay.properties”。
       chrome/
       └ helloworld/
         ├ skin/
         ├ content/
         └ locale/
           └ en-US/
             ├ helloworld.dtd
             ├ overlay.dtd
             └ overlay.properties
打开 overlay.properties 文件,在其中添加如下一行代码,定义一组 String Bundles,为前面提到的确认对话框中的文本定义一个简短的标识名称(Identifier)。
SayHello_Confirm=Welcome to Hello World! Click OK to continue.
注意 properies 文件中 String Bundles 的语法格式是:
名称=文本
将来 javascript 脚本文件可以根据标识名称到 properties 文件中引用需要显示的文本。请注意用 Escaped Unicode 编码格式保存编辑完成的 properties 文件。
  • 我们已经准备好了 properties 文件,现在还需要让 javascript 脚本文件能够引用 properties 文件中的文本。
XUL 提供的 stringbundle 元素(Element)可以帮助我们完成这项工作。stringbundle元素包括许多特性(Properties)和方法(Methods),利用它们就可以返回 properties 文件中的文本。下面用到的getString 是其中一个比较简单的方法。
首先需要确定是哪一个 XUL 文件调用了这个 javascript 脚本文件。查看 content 文件夹中的几个 XUL文件,你可以在 overlay.xul 文件的前面几行中找到如下一行代码,依据它我们可以判断正是 overlay.xul 调用的overlay.js 脚本文件。
<script type="application/x-javascript" src="overlay.js"/>
在 overlay.xul 文件中紧接上面这行代码添加这样一段代码:
<stringbundleset id="stringbundleset">
  <stringbundle id="helloworld-strings" src="chrome://helloworld/locale/overlay.properties" />
</stringbundleset>
这段代码定义了一个 stringbundle 元素,并指出保存 String Bundles 的 overlay.properties 文件的位置。
注意,通常情况下,一个 XUL 文件可能会调用多个 javascript 脚本文件。那么在这个 XUL文件里,必须为它调用的每一个脚本文件定义对应的 stringbundle 元素,使脚本文件可以找到它需要的 properties文件,而不管这个 stringbundle 元素是不是在别的 XUL 文件中已经定义过。当然,即使在不同 XUL 文件中,相同stringbunble 元素一般使用相同 id。
这时候实际上是定义了一组 stringbundle 元素集。它有类似下面这样的格式:
<stringbundleset id="stringbundleset">
  <stringbundle id="example-A" src="chrome://.../locale/01.properties" />
  <stringbundle id="example-B" src="chrome://.../locale/02.properties" />
  <stringbundle id="example-C" src="chrome://.../locale/03.properties" />
</stringbundleset>
  • 回到 overlay.js 文件,添加如下两行代码,定义 strBundle 和 sayhello 两个变量,并用定义的变量“sayhello”替换原来在对话框中显示的那段文本。完成后保存文件。
var strBundle = document.getElementById("helloworld-strings");
var sayhello = strBundle.getString("SayHello_Confirm");

var bConfirmed = window.confirm(sayhello);
这两个变量的作用是: 首先通过 id 定位在 XUL 文件中定义的 stringbundle 元素,然后根据我们之前定义的标识名称到properties 文件中寻找需要显示的文本,由 getString 返回这些文本。这时候 confirm() 中 sayhello的值实际上就是引用的文本“Welcome to Hello World! Click OK tocontinue.”。这样,将来我们只需要翻译 properties 文件中的文本就可以很方便的实现 javascript 脚本文件的本地化。
  • 另外,XUL 还提供了一个稍复杂的方法,用 getFormattedString 返回一组字符串或文本。这个方法在我们给的 HelloWorld 扩展中并没有遇到,所以这里只稍加叙述。
getFormattedString 的格式为:
getFormattedString("字符串名称", [字符串阵列])
例如,在 javascript 脚本中定义变量为:
var strBundle = document.getElementById("extension-strings");
var fileInfo = strBundle.getFormattedString("fileInformation", [fileName, fileSize]);
在 properties 文件中,文本定义为:
fileInformation=The file is called %1 and its size is %2.
其中 %1 和 %2 将依次替换为 fileName 和 fileSize 的值。
  • 一般情况下,在一个扩展中你会碰到多个需要本地化的 javascript 脚本文件,你需要重复 (1) 到 (5)的步骤直到为每一个需要本地化的 javascript 脚本文件都创建一个对应的 properties 文件。同样,每组对应的javascript 脚本文件和 properties 文件除了文件扩展名不同,应该使用相同的主文件名。
  创建自己的 Bundle 你可能会觉得使用 XUL 提供的 stringbundle 元素,还要找到调用 javascript 脚本文件的 XUL 文件,然后在XUL 文件中定义 stringbundle 元素,这样太麻烦了。那么你也可以使用 nsIStringBundleService 模块在javascript 脚本文件中自己创建 Bundle。
首先,同样需要在 properties 文件添加如下一行代码:
SayHello_Confirm=Welcome to Hello World! Click OK to continue.
然后,在 overlay.js 文件里添加这样一段代码:
function TranslateString(strName)
{ var src = "chrome://helloworld/locale/overlay.properties";
  var stringBundleService = Components.classes["@mozilla.org/intl/stringbundle;1"]
   .getService(Components.interfaces.nsIStringBundleService);
  var Bundle = stringBundleService.createBundle(src);

  return Bundle.GetStringFromName(strName);
}
在这段代码中,我们不但创建了自己的 Bundle,还定义了一个 TranslateString() 函数。它们的作用是,首先getStringFromName 根据标识名称从 properties 文件中引用文本,然后用 TranslateString()返回这些文本。
现在用这个函数替换 overlay.js 中需要在用户界面显示的文本,并将函数的参数用文本的标识名称替换:
function helloWorld()
{
  var bConfirmed = window.confirm(TranslateString("SayHello_Confirm"));

  if(bConfirmed)
  {
    window.open("chrome://helloworld/content/","helloworld","chrome,centerscreen");
  }
}
这样,用这个简单的方法,我们同样也可以实现 javascript 脚本文件的本地化。
发表于 2008-12-13 18:10:33 | 显示全部楼层
Q 我承认你是VIP,但你也没必要这样发吧。
 楼主| 发表于 2008-12-13 18:13:05 | 显示全部楼层

总结一下本地化的重要方法

在 locale 文件夹下,
每个以 ISO 语言代码(例如 en-US)命名的文件夹中就保存着所有可本地化的文本文件。
===========
XUL文件的本地化
* DTD (.dtd) 文件
DTD 文件用来定义实体,
包含由 XUL 文件引用的文本。
字符编码格式为: UTF-8,
并要求不写入 UTF-8 文件头标记(BOM)。
------------
把Entity看作是一个常量,它有一定的值。
引用Entity的时候,必须要在Entity名称前面加上“&&”符号,后面加上“;”符号。
------------
示例:占位
===========
脚本中文本的地化。
* properties (.properties) 文件
包含由 javascript 及其他脚本文件引用的文本。
字符编码格式为: Escaped Unicode (\uXXXX)
-----------------------------
使用 properties 文件和 String Bundles 来实现 javascript 脚本文件的本地化。
------------
示例:占位
 楼主| 发表于 2008-12-14 12:06:33 | 显示全部楼层

JavaScript函数对象

1:声明式函数
//在加载页面时,只解析一次.随后无论参数的变化如何,调用次数多少:使用的都是同一个函数对象
语法:
function functionName(param1,...paramN){
&#160;&#160;&#160;&#160;&#160; function statements;
}&#160;
&#160;
2:匿名函数
//每次请求调用时,都解析(动态重构)
语法:
var variable = new Function("param1",..."paramN","function statements");
&#160;
3:函数直接量/函数表达式
//同匿名函数类似,区别是:只解析一次
var variable = (param){
&#160;&#160;&#160;&#160;&#160; function statements;
}
&#160;
4:一次性对象的函数表现形式:
先看一下一次性对象(prototype采用的对象开发结构):
var variable = new Object(){
&#160;&#160;&#160; variable.variA="Va1";
&#160;&#160; variable.variB="Va2";
&#160;&#160; variable.method = function(){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return this.variA + variB;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
}
&#160;
//我们也可以用旧函数来创建一个类似的对象,然后将其赋值给一个变量,并将其作为一次对象来使用
var variable = new function(){
&#160;&#160;&#160;&#160; this.variA="Va1";
&#160;&#160;&#160;&#160; this.variB="Va2";
&#160;&#160;&#160;&#160; this.method=function(){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return variA + variB;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
}
 楼主| 发表于 2008-12-14 12:38:29 | 显示全部楼层

venkman的变量查看工具

四种查看状态

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入会员

x
 楼主| 发表于 2008-12-14 13:14:58 | 显示全部楼层

生成器表达式

https://developer.mozilla.org/cn/New_in_JavaScript_1.8

这个新添加的特性,允许你简单的创建生成器(在JavaScript 1.7引入的)。通常你以前需要创建一个自定义的函数,它含有一个 yield,但是这个新特性使你可以使用类似数组概念的语法来创建一个独立的生成器句柄。
在&#160;JavaScript 1.7&#160;中,你可能需要写出想下面这样的代码来为一个对象创建自定义的生成器:
function add3(obj) {   for ( let i in obj )     yield i + 3; }  let it = add3(someObj); try {   while (true) {     document.write(it.next() + "<br>\n");   } } catch (err if err instanceof StopIteration) {   document.write("End of record.<br>\n"); }在 JavaScript 1.8 中,你可以规避要重建生成器函数的麻烦,而使用一个生成器表达式来代替:
let it = (i + 3 for (i in someObj)); try {   while (true) {     document.write(it.next() + "<br>\n");   } } catch (err if err instanceof StopIteration) {   document.write("End of record.<br>\n"); }生成器表达式也可以像数值那样被传给一个函数。非常值得注意的是,生成器在绝对必要的有用的时候才被运行(并不像典型的数组概念的条件那样,预先搭好数组的结构)。这个区别可以从下面的例子中看到:
使用JavaScript 1.7 数组理念
handleResults([ i for ( i in obj ) if ( i > 3 ) ]);  function handleResults( results ) {   for ( let i in results )     // ... }使用 JavaScript 1.8 的生成器表达式
handleResults( i for ( i in obj ) if ( i > 3 ) );  function handleResults( results ) {   for ( let i in results )     // ... }这两个例子之间最大的区别就是,使用生成器表达式的时候,只需要循环那个 'obj' 结构一次,总共;而在第一个例子中,将会在递归的时候再循环一次。
 楼主| 发表于 2008-12-14 13:20:16 | 显示全部楼层

FireFox JavaScript引擎私有属性

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

QQ|手机版|Archiver|火车采集器官方站 ( 皖ICP备06000549 )

GMT+8, 2025-4-28 08:58

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表