标签: safari6

在Safari 6中禁用JIT以解决严重的Javascript JIT错误

我们发现我们的Javascript代码的解释存在严重问题,这些代码仅发生在iOS 5/Safari 6(当时的iPad版本)上,我们认为这是由于Safari中的Just in Time JS编译器中的关键错误.(请参阅下面的更新,了解更多受影响的版本和现在似乎包含修复的版本).

我们最初在我们的库的在线演示中发现了这个问题:演示或多或少地随机崩溃,但这只是第二次(甚至更晚)发生相同代码的执行.即如果你运行一部分代码,一切正常,但后续运行会使应用程序崩溃.

有趣的是,在Chrome for iOS中执行相同的代码问题没有显示,我们认为这是由于Chrome for iOS中使用的Webview缺少JIT功能.

经过大量的摆弄,我们终于认为我们发现了至少一个有问题的代码:

  var a = 0; // counter for index
  for (var b = this.getStart(); b !== null; b = b.getNext()) // iterate over all cells
    b.$f = a++; // assign index to cell and then increment 
Run Code Online (Sandbox Code Playgroud)

本质上,这是一个简单的for循环,它将链表中的每个单元格分配给它的索引.这里的问题是循环体中的后增量操作.当前计数被分配给字段并在计算表达式后更新,基本上与首先分配a然后将其递增1相同.

这在我们测试的所有浏览器和Safari中的前几次都可以正常工作,然后突然看起来似乎计数器变量a首先递增,然后分配结果,就像预增量操作一样.

我创建了一个小提琴,显示了这里的问题:http://jsfiddle.net/yGuy/L6t5G/

在带有iOS 6的iPad 2上运行示例并且所有更新结果对于我的情况下的前两次运行是正常的,并且在第三次运行中突然显示列表中的最后一个元素具有指定的值,其中一个是关闭的(输出当你点击"点击我"按钮从"从0到500"变为"从0到501"时

有趣的是,如果你切换标签,或稍等一下,可能会发生突然结果是正确的两次左右的运行!似乎Safari有时重置是JIT缓存.

所以,因为我认为Safari团队可能需要很长时间来修复这个bug(我还没有报告),并且可能还有其他类似的错误,比如潜伏在JIT中同样难以找到的,我想知道是否有办法在Safari中禁用JIT功能.当然这会降低我们的代码(已经非常占用CPU),但速度比崩溃慢.

更新:不出所料,它不仅仅是受影响的后增量运算符,还有后减量运算符.更令人惊讶和更令人担忧的是,如果赋值,则没有区别,因此在现有代码中查找赋值是不够的.例如,下面的代码b.$f = (a++ % 2 == 0) ? 1 : 2;中,变量值未分配,但仅用于三元运算符条件,在某种意义上"失败",有时选择了错误的分支.目前看起来似乎只有在根本不使用邮政运营商时才能避免问题.

更新:同样的问题不仅存在于iOS设备中,而且存在于Safari 6中的 …

javascript safari jit safari6

19
推荐指数
1
解决办法
2452
查看次数

console.log()在Safari 6.0 Web Inspector中不起作用

console.log('hi');

undefined
Run Code Online (Sandbox Code Playgroud)

6.0中有类似的实现吗?或者我做错了什么?

javascript safari6

17
推荐指数
3
解决办法
2万
查看次数

文本输入字段在safari中不起作用

我无法弄清楚为什么,但由于某种原因,我的文本输入字段在safari中不起作用(任何版本,据我所知).用户无法输入文本框.我在这里不知所措,因为它适用于所有其他浏览器(包括IE6,虽然它看起来很糟糕).这是现场网站:在此输入链接说明

谢谢.

html css safari mobile-safari safari6

9
推荐指数
1
解决办法
6785
查看次数

jQuery方法在Safari 6中不起作用

拉出我的头发.简单的jQuery方法在Safari 6中不起作用.

以下代码块适用于我测试过的除Safari 6以外的所有其他浏览器.它在Safari 5及更早版本中运行良好,在Firefox中运行良好,在IE中运行良好.它也适用于Chrome.

警报会在Safari 6中弹出,因此该函数仍会触发,但其他3种方法都没有任何反应.

-----更新-----在几台机器上进一步测试后...我发现它只能在Mac OSX 10.8的Safari 6中无法运行.该代码在OSX 10.7中的相同版本的Safari中工作正常.--------------------

我正在运行jQuery 1.8.3.我的页面验证为HTML5.

HTML:

<div id="fileUploadFormContainer">

    <form id="fileUploadForm" action="/upload/do_upload/<?=$row->project_id?>" method="post" enctype="multipart/form-data" >
        <fieldset>
        <label for="userfile">Attach a file</label>
            <input type="file" name="userfile" id="userfile" /><br />
            <input type="submit" id="fileUploadSubmit" value="Upload file" />
            <img class="loadingBar" id="fileUploadLoadingBar" src="/images/indicators/ajax-loader.gif" alt="" />
        </fieldset>
    </form>
</div><!-- end fileUploadFormContainer -->
Run Code Online (Sandbox Code Playgroud)

CSS:

.loadingBar {
    display: none;
}
Run Code Online (Sandbox Code Playgroud)

JavaScript的:

$(function(){
    // Submit Buttons
    $('#fileUploadSubmit').click(function()
    {
        $('#fileUploadSubmit').attr('value', 'Uploading');
        $('#fileUploadSubmit').fadeTo('fast',0.6);
        $('#fileUploadLoadingBar').fadeIn('fast');
        alert('Finished');
    });
});
Run Code Online (Sandbox Code Playgroud)

safari jquery safari6

7
推荐指数
1
解决办法
2101
查看次数

Safari 6 svg标签使用问题

链接:http://jsfiddle.net/xkpeD/

要不就

<svg width="300px" height="300px" version="1.1" xmlns="http://www.w3.org/2000/svg"    xmlns:xlink="http://www.w3.org/1999/xlink">
  <circle cx="50" cy="50" r="20" fill="pink" fill-opacity="0.5"/>
  <use xlink:href="#:example" x="20" y="20"/>
  <defs>
    <circle id=":example" cx="50" cy="50" r="20" fill="pink" fill-opacity="0.5"/>
  </defs>
</svg>?
Run Code Online (Sandbox Code Playgroud)

它在所有浏览器(IE9,Chrome,Firefox,Safari 5.1)中都显示正常,但在新的Safari 6中,只渲染了1个圆圈.似乎所有<use>标签都没有在Safari 6中呈现.

有什么帮助吗?

safari svg safari6

6
推荐指数
2
解决办法
4446
查看次数

为什么禁用的文本在Safari中不会以黑色呈现?

我试图将禁用的输入元素内的文本显示为黑色.这适用于大多数浏览器:

input[type="text"][disabled],
input[type="text"]:disabled {
  color: #000000;
}
Run Code Online (Sandbox Code Playgroud)

但是,在Safari(版本6.0.2)中,文本稍微亮一些.让我最困惑的是,当我在浏览器中选择文本并在我的控制台上查找元素信息时,它清楚地显示:

rgba(0,0,0)
Run Code Online (Sandbox Code Playgroud)

因此,在它的代码是黑色的,但尽管如此,它在东西呈现其他较黑.这怎么可能?

这是一个Safari bug吗?

感谢您对此事的任何帮助.

css safari css3 safari6

6
推荐指数
2
解决办法
4193
查看次数

Mac OS X Safari 6默认搜索引擎在可能的值之间切换

我想在Mac OS X上以编程方式更改Safari默认搜索引擎.我知道有3个可能的值,但Safari存储当前值的位置?我想从Cocoa代码中将Google更改为Yahoo.可能吗?

我在文件中看到一个SearchProviderIdentifierMigratedToSystemPreference变量设置为YES com.apple.Safari.plist,可以找到~/Library/Preferences.这可能是当前值的关键,但存储了"系统偏好"的位置?你有任何线索吗?


更新:我发现此命令defaults read -g NSPreferredWebServices始终返回所选的默认搜索引擎.这个问题是,当我更改它的值时,safari不会更改该值.
这是将值更改为Bing的命令:
defaults write -g NSPreferredWebServices '{NSWebServicesProviderWebSearch = { NSDefaultDisplayName = Bing; NSProviderIdentifier = "com.bing.www"; }; }';

该命令应在终端中执行.

safari cocoa osx-mountain-lion safari6

5
推荐指数
1
解决办法
1182
查看次数

是否有一种简单的转换方法,用于将chrome消息传递转换为safari消息传递语法?

我的Chrome扩展程序使用邮件传递从后台页面上扩展程序内置的localstorage区域中检索各种值.

关于chrome消息传递我喜欢的事情是,它允许你在sendMessage调用中包含一个回调函数,如下所示:

chrome.runtime.sendMessage({greeting: "hello"}, function(response) {
    console.log(response.farewell);   
});
Run Code Online (Sandbox Code Playgroud)

并且相应的邮件接收代码如下所示(Chrome扩展文档中的示例代码):

chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    console.log(sender.tab ?
                "from a content script:" + sender.tab.url :
                "from the extension");
    if (request.greeting == "hello")
      sendResponse({farewell: "goodbye"});
  });
Run Code Online (Sandbox Code Playgroud)

我正在尝试将我的扩展转换为Safari扩展格式,但我无法弄清楚如何将Chrome sendMessage/onMessage函数映射到Safari的 safari.self.tab.dispatchMessage(name, data)消息处理函数

甚至可以在Safari的dispatchMessage函数调用中包含回调函数吗?如果没有,我应该如何解决这个限制?

javascript google-chrome-extension safari-extension safari6

5
推荐指数
1
解决办法
1185
查看次数