jQuery选择器无法在Windows Phone 7上运行

我对WP7(7.1)的Web应用程序有一个奇怪的问题。

适用于Chrome,Safari等的代码:

$.each(val, function(sub_key, sub_val) { $("."+sub_key).html(sub_val); }); 

使用中的变量示例:

 sub_key : title-home sub_val : This is home 

这不适用于WP7(v.7.1)。 我尝试了无穷无尽的组合,但让选择器工作的唯一方法是在选择器内定义一个静态字符串。 像这样:

 $.each(val, function(sub_key, sub_val) { $(".title-home").html(sub_val); }); 

这当然不是一种选择。 在加入像我这样的字符串时,IE中是否存在某种错误?

BTW我认为WP7正在使用IE 7引擎。

干杯Johe

–edit:如果您在页面上没有运行javascripts时遇到问题:请务必查看我在http://social.msdn.microsoft.com/Forums/en-AU上发布的主题的调查结果/ jscript / thread / bac9f056-e0de-449e-a1b6-36e745fa59c6 – 也许你的问题与一些不幸的时间或属性设定器排序有关。 事实certificate,如果您在XAML中对URL进行硬编码,那么您必须确保在该XAML中,在SOURCE属性之前设置IsScriptEnabled,否则您将有很多失败取决于您的页面具有哪种doctype。 这同样适用于在代码中设置Source或Navigate’,但那里很明显。 另一方面,乍一看,绑定似乎无论如何都能正常工作。 – /编辑

它可能对你没什么帮助,但我会发布它,因为它可能会帮助许多其他人使用WP7和jQuery:

请确保您使用其团队标记的最新JQ为ok-with-wp7。 我最近在与一个网站进行互操作,其中pulisher不断混合不同版本的JQ。 从我简陋的实验中,只有当前的jQuery 1.6.2在WebBrowser控件中正常工作,jQueryMobile也表现不错。 在我使用的那个网站上常用的1.4.x和1.5.x版本 – 完全无法解析jQ.js核心脚本的某个地方,很快就说 – 页面加载后jQuery和$符号’未定义’。 BTW。 如果我没记错的话,那是7.0(来自MS:“IE7和IE8之间的东西”)和7.1(无意中听到某些地方:“IE8和IE9之间的东西”)兼容性稍微好一点,但并不完美..如果你可以先试试jQmobile。

关于失败的js代码 – 扫描页面时你必须非常小心。 你说WP7.1应用程序 – 所以我假设你在WebBrowser控件内工作。 如果是这样 – 然后将您的JS脚本从页面中删除,将其作为字符串在您的应用程序中的某处复制,然后在WebBrowser.NavigationCompleted上 – 尝试通过WebBroweser.InvokeScript手动执行该脚本。 如果有任何实际错误 – 你将得到一个exception,很可能是“ComException 0x80020101。你知道…… WebBrowser在那件事情上很奇怪,这是因为许多不同原因而返回的心爱的错误代码..反正:

如果发生该错误,JS会立即中止,并且除了您能够捕获之外,您的代码将获得。 除了对象之外你将得到……根本没有任何信息。 可怜。 但是有了一些技巧,你可以使用JS代码玩扫雷并将其降低到可以正常工作或崩溃的最小例子 – 也许你会推断出怎么了最新的。

一些错误,例如:
– 尝试使用未知的名称,可能返回“未定义”但也可能崩溃,尤其是在全球范围内
– 试图意外地将窗口,window.external和其他本地字符串化,可能会导致崩溃
– 尝试触摸文档的BODY,在完全加载之前,可能会导致崩溃
– … 等等。 请注意,“在页面加载之前”只是我的猜测。 我假设您在收到’webbrowser.navigated’事件后尝试使用您的页面,因为这是第一个理所当然的事情,因为浏览器会通知您页面已加载。 然而,即使如此,你仍然可以得到那个错误,而这可能只是关于不合时宜的时机。 如果稍后重试调用完全相同的代码,则可以成功,没有任何exception。

原谅我,但我会再说一遍:大多数时候,如果发生任何不良情况,你会得到一个“找不到名字/ COM0x80020101”错误,这将导致JS代码或文件静默中止并被跳过。 它通常不代表例外名称的含义。 这只是JS中的一般错误。 偶尔你会得到一些其他例外,但那是95%到5%。 顺便说一句。 其他例外通常也包含非常无意义的数据。

现在,我提到了一些技巧。

WebBrowser.InvokeScript是错误的…让我们说,使用起来不友好。 它用于调用javascript注册的全局函数。 InvokeScript有2个重载:( 字符串名称)和(字符串名称,对象[]参数) 。 重要的是要知道 ,第一个参数是函数的NAME 。 它必须是一个名字。 它不能是一个任意的JS代码,InvokeScript按名称查找函数,如果找不到,则抛出一个.. 0x80020101 :)参数/字符串 – 你可以传递任何东西。

我正在编写所有这些内容,以帮助您最终手动调试/扫描JS代码。 如果在WebBrowser.NavigationCompleted事件处理程序中设置断点,或者之后调用的地方,您可以在调试器的监视窗口内以交互方式使用JS,使用单个,保证存在的js-core的强大技巧function: 评估

虽然InvokeScript只能通过“eval”函数调用一个名称选择的函数,但您可以执行完全任意的代码。 我(不是一次)将整个JQuery1.6.2库注入/评估到页面中,只是为了检查它是否有效或者在页面上摆弄内容 – 因为页面链接到ie。 在WP7上被破坏的JQ1.4。

但是请注意,即使InvokeScript的重载声称返回“对象”,也不要被它愚弄。 至少在玩eval时,他们无法这样做。 他们唯一能够返回的是纯字符串。 无论你试图返回什么,它都会以“”,空字符串的forms返回。 我已经检查过7.0,7.1和7.5。 对象[] params也是可疑的。 我设法只传递字符串。

键入Watch窗口的示例(假设’wb’是WebBrowser控件)

 wb.InvokeScript("eval", " 'mom' "); // returns string, 'mom' wb.InvokeScript("eval", " window "); // returns empty string wb.InvokeScript("eval", " ' '+window "); // returns [object Object] -- note the ' '+ -- to stringify it before returning wb.InvokeScript("window"); // 0x80020101 wb.InvokeScript(" 5+5 "); // 0x80020101 :) wb.InvokeScript(" 'mom' "); // 0x80020101 :)) wb.InvokeScript("myfunction"); // 0x80020101 or calls your function from JS wb.InvokeScript("function blah(){return 5+5}; ' '+blah() "); // 0x80020101 wb.InvokeScript("eval", " '5'+'5' "); // returns '55' - only with eval you may exec custom code wb.InvokeScript("eval", "function blah(){return 5+5}; ' '+blah() "); // you can even define functions - returns 10 wb.InvokeScript("eval", " ' ' + blah() "); // what's more, whatever you do, it's permanent, functions is still there, returns 10 // JQ works too: wb.InvokeScript("eval", " ' ' + $ "); // if you see" undefined", the JQ failed to load wb.InvokeScript("eval", " ' ' + jQuery "); // the same as above wb.InvokeScript("eval", myVariable_withCached_JQueryCoreCode); // works! (at least on 7.1 and JQ162) wb.InvokeScript("eval", " ' ' + jQuery "); // jq dump, if it was loaded properly wb.InvokeScript("eval", " ' ' + $ "); // the same wb.InvokeScript("eval", " ' ' + $(document.body)[0] "); 

在我的情况下的最后一行,有时扔,有时没有。 如果它扔了,我通常能够再次成功重新调用它,例如,250ms之后,设置了一个计时器_in_the_app_code_,但是在setTimeout中无法做同样的事情! 当我试图从JS内部执行类似的延迟调用时,它有时会起作用,但有时甚至会使整个应用程序崩溃。我敢打赌,例外情况是80020101,但是在花了5+之后我才对此感到生气跟踪那件事情的小时..有趣的是,但如果同一行提到document.head而不是document.body – 没有exception抛出,永远。

我想我再写了一点太多,抱歉:)

quetzalcoatl,两件事:

  1. 你怎么知道Windows Phone的JQuery版本还可以? 我没有看到任何关于此的官方消息。
  2. 调试器的事情怎么样? 如果我在Navigated的处理程序中设置断点,我想显示的页面无法正确加载,我无法成功使用Watch。