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

最佳答案 – 编辑:

如果您在页面上没有运行的javascripts有问题:请务必检查我在
http://social.msdn.microsoft.com/Forums/en-AU/jscript/thread/bac9f056-e0de-449e-a1b6-36e745fa59c6发布的主题的调查结果 – 也许您的问题与一些不幸的时间或属性设置器排序有关.事实证明,如果您在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脚本从页面中删除,将其作为字符串在你的app中的某个地方复制,然后在WebBrowser.NavigationCompleted上 – 尝试通过WebBroweser.InvokeScript手动执行该脚本.如果有任何实际错误 – 你将得到一个异常,很可能是“ComException 0x80020101.你知道…… WebBrowser在那件事情上很奇怪,它是为多种不同的原因返回的心爱的错误代码..反正:

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

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

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

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

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

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

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

但是请注意,即使InvokeScript重载的foth声称返回“对象”,也不要被它愚弄.至少在玩eval时,他们无法这样做.他们唯一能够返回的是纯字符串.无论你试图返回什么,它都会以“”,空字符串的形式返回.我已经检查过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 – 没有异常抛出,永远.

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

点赞