小编Fab*_*tté的帖子

为什么我的变量在函数内部修改后没有改变? - 异步代码引用

鉴于以下示例,为什么outerScopeVar在所有情况下都未定义?

var outerScopeVar;

var img = document.createElement('img');
img.onload = function() {
    outerScopeVar = this.width;
};
img.src = 'lolcat.png';
alert(outerScopeVar);
Run Code Online (Sandbox Code Playgroud)

var outerScopeVar;
setTimeout(function() {
    outerScopeVar = 'Hello Asynchronous World!';
}, 0);
alert(outerScopeVar);
Run Code Online (Sandbox Code Playgroud)

// Example using some jQuery
var outerScopeVar;
$.post('loldog', function(response) {
    outerScopeVar = response;
});
alert(outerScopeVar);
Run Code Online (Sandbox Code Playgroud)

// Node.js example
var outerScopeVar;
fs.readFile('./catdog.html', function(err, data) {
    outerScopeVar = data;
});
console.log(outerScopeVar);
Run Code Online (Sandbox Code Playgroud)

// with promises
var outerScopeVar;
myPromise.then(function (response) {
    outerScopeVar = response;
});
console.log(outerScopeVar);
Run Code Online (Sandbox Code Playgroud)

// geolocation API
var outerScopeVar; …
Run Code Online (Sandbox Code Playgroud)

javascript asynchronous

675
推荐指数
6
解决办法
18万
查看次数

使用jquery解析html字符串

我试图通过jQuery解析这个html来获取data1,data2,data3.虽然我确实获得了data2和data3,但我无法使用我的方法获取data3.我是jQuery的新手所以请原谅我的无知.

<html>
<body>
   <div class="class0">
    <h4>data1</h4>
    <p class="class1">data2</p>
    <div id="mydivid"><p>data3</p></div>    
   </div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

这是我在jquery中调用它的方式.

var datahtml = "<html><body><div class=\"class0\"><h4>data1</h4><p class=\"class1\">data2</p><div id=\"mydivid\"><p>data3</p></div></div></body></html>";

alert($(datahtml).find(".class0").text()); // Doesn't Work

alert($(datahtml).find(".class1").text()); // work 

alert($(datahtml).find("#mydivid").text()); // work
Run Code Online (Sandbox Code Playgroud)

只有alert($(datahtml).find(".class0").text());不工作,其余的工作正如预期的那样.我想知道它可能是因为class0里面有多个标签或者是什么?如何在这种情况下获取data1?

jquery

35
推荐指数
2
解决办法
9万
查看次数

在用户输入上调用json_decode是否安全?

我在cookie中存储JSON编码的整数索引=>整数值的数组.

显然,cookie可以像任何其他用户输入一样轻松操作,所以这是我的cookie getter验证:

if ($_COOKIE['myCookie']) { //if cookie exists
    $myCookie = json_decode($_COOKIE['myCookie'], true);
    if (!is_array($myCookie)) { //in case decoding fails or bad cookie
        $myCookie = array(); //sets it as empty array
    }
} else { //if cookie doesn't exist, uses an empty array instead
    $myCookie = array();
}
Run Code Online (Sandbox Code Playgroud)

然后在使用任何值之前,我检查它是否存在于数组中并针对列出白名单的值进行测试 - 这部分看起来非常安全,但我发布它是因为它是验证的一部分:

if (!empty($myCookie[$index])) { //checks if index exists and is truthy
    if ($myCookie[$index] !== 1 && $myCookie[$index] !== 2) { //values whitelist
        die('Hacking attempt through cookies exploit.');
    }
    //use the …
Run Code Online (Sandbox Code Playgroud)

php input-sanitization

28
推荐指数
3
解决办法
8046
查看次数

干净的方式以编程方式使用JS的CSS转换?

正如标题所暗示的那样,是否有正确的方法来设置一些初始CSS属性(或类)并告诉浏览器将这些转换为另一个值?

例如(小提琴):

var el = document.querySelector('div'),
    st = el.style;
st.opacity = 0;
st.transition = 'opacity 2s';
st.opacity = 1;
Run Code Online (Sandbox Code Playgroud)

这不会为Chrome 29/Firefox 23中元素的不透明度设置动画.这是因为(来源):

[...]你会发现,如果你同时应用两组属性,那么浏览器会尝试优化属性更改,忽略初始属性并阻止转换.在幕后,浏览器在绘制之前批量处理属性更改,虽然通常会加快渲染速度,但有时会产生不利影响.

解决方案是在应用两组属性之间强制重绘.这样做的一个简单方法就是访问DOM元素的offsetHeight属性[...]

事实上,黑客确实可以在当前的Chrome/Firefox版本中运行.更新了代码(小提琴 - Run打开小提琴后点击再次运行动画):

var el = document.querySelector('div'),
    st = el.style;
st.opacity = 0;
el.offsetHeight; //force a redraw
st.transition = 'opacity 2s';
st.opacity = 1;
Run Code Online (Sandbox Code Playgroud)

但是,这是相当hackish,并报告在某些Android设备上不起作用.

另一个答案建议使用,setTimeout以便浏览器有时间执行重绘,但它也失败了,因为我们不知道重绘需要多长时间.猜测一个相当大的毫秒数(30-100?)以确保重绘意味着牺牲性能,不必要地闲置,希望浏览器在那么短的时间内执行一些魔术.

通过测试,我发现了另一种解决方案,它在最新的Chrome上运行良好,使用requestAnimationFrame(小提琴):

var el = document.querySelector('div'),
    st = el.style;
st.opacity = 0;
requestAnimationFrame(function() {
    st.transition …
Run Code Online (Sandbox Code Playgroud)

javascript css transition css3 css-transitions

20
推荐指数
2
解决办法
4982
查看次数

在Chrome上使用display:none重置GIF动画的正确方法

标题是不言自明的,但我将逐步提供有关此事的观点.希望我不是第一个注意到Webkit/Chrome上这个(显然)错误的人.

我想重置一个GIF动画.到目前为止我见过的所有例子都只是简单地将src图像设置为自身,或者将其设置为空字符串,然后src再将其设置为原始字符串.

看看这个JSFiddle以供参考.GIF在IE,Firefox和Chrome上完全重置.

我遇到的问题是图片display:noneGoogle Chrome上显示.

检查这个JSFiddle.在显示在页面中之前,GIF在IE和Firefox上重置得很好,但Chrome只是拒绝重置其动画!

到目前为止我尝试过的:

  • src像在小提琴中一样设置自身在Chrome中不起作用.
  • 将其设置src为空字符串并将其恢复为默认值也不起作用.
  • 在图像周围放置一个包装器,清空容器.html('')并将图像放回其中,也不起作用.
  • 在设置之前或之前更改display图像也不起作用..show().fadeIn()src

只有我已经发现迄今的解决方法是保持图像与它的默认display,并通过操纵它.animate()ING和.css()荷兰国际集团的透明度,高度和能见度在必要时模拟display:none的行为.

这个问题的主要原因(上下文)是我想在页面中淡化之前重置ajax加载器GIF.

所以我的问题是,是否有一种正确的方法来重置GIF图像的动画(这可以避免Chrome的display:none"bug")或者它实际上是一个错误?

(ps.您可以更改小提琴中的GIF以获得更合适/更长的动画gif进行测试)

html javascript jquery google-chrome animated-gif

19
推荐指数
4
解决办法
5万
查看次数

带有jQuery 1.8的jQuery UI 1.8.22在对话框按钮中没有文本

我去检查最近发布的jQuery 1.8(稳定版)是否与我当前正在开发的项目兼容,令我惊讶的是这是我看到的第一件事:

在此输入图像描述

这对我来说是一个惊喜,因为我已经升级到jQuery UI 1.8.22,根据它的发布帖子,它与jQuery 1.8兼容.

调用回调函数,但按钮没有textNode在DOM检查器中可以看到的s:

在此输入图像描述

到目前为止我找到的解决方案是:

  1. 降级回jQuery 1.7.2(我想在我的页面中使用最新的jQuery版本)
  2. 升级到jQuery UI 1.9.0pre(它不稳定)
  3. 使用open处理程序或手动编辑对话框的HTML以包含我想要的文本.对于源代码中的错误,似乎有很多不必要的麻烦.

我错过了什么或这是一个真正的错误?

这是我用于演示的小提琴:

的jsfiddle

以及未来参考的代码:

HTML:

<div id="foo" title="Dialog title">Dialog text</div>
Run Code Online (Sandbox Code Playgroud)

JS:

$('#foo').dialog({
    buttons: {
        Yes: function() { $(this).dialog('close'); },
        No: function() { $(this).dialog('close'); }
    }
});
Run Code Online (Sandbox Code Playgroud)

jquery jquery-ui

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

只返回一个属性"_id"

我想知道如果有只返回一个方式_id,user_idtotal没有items子文档.

{
    "_id" : 122,
    "user_id" : 123456,
    "total" : 100,
    "items" : [
            {
                    "item_name" : "my_item_one",
                    "price" : 20
            },
            {
                    "item_name" : "my_item_two",
                    "price" : 50
            },
            {
                    "item_name" : "my_item_three",
                    "price" : 30
            }
    ]
}
Run Code Online (Sandbox Code Playgroud)

mongodb

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

使用值初始化数组 - 我应该显式实例化该类吗?

我经常看到数组被初始化如下:

String[] array = new String[] { "foo", "bar", "baz" };
Run Code Online (Sandbox Code Playgroud)

但阅读语言基础 - 数组表明,短语法不需要显式实例化构造函数:

或者,您可以使用快捷语法来创建和初始化数组:

 int[] anArray = { 
     100, 200, 300,
     400, 500, 600, 
     700, 800, 900, 1000
 };
Run Code Online (Sandbox Code Playgroud)

所以,假设这两种初始化方法:

String[] array = new String[] { "foo", "bar", "baz" };
String[] array2 = { "foo", "bar", "baz" };
Run Code Online (Sandbox Code Playgroud)

这些之间有什么区别吗?双方似乎工作一样,在这种情况下我应该承担的第二个隐式调用的new String[],第一个就是一个更详细的方式,还是有更多的它在幕后?

从Java开始很抱歉,如果这对于一个问题太愚蠢了,但我在网上找不到任何相关信息.

java

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

在阵列中存储JS Regex捕获组的最佳方法?

究竟是什么标题要求.在解释我的问题时,我会提供一些例子.

测试字符串:

var test = "#foo# #foo# bar #foo#";
Run Code Online (Sandbox Code Playgroud)

说,我想在#(所有foo但不是bar)之间提取所有文本.

var matches = test.match(/#(.*?)#/g);
Run Code Online (Sandbox Code Playgroud)

使用.match如上面,它就会储存所有的比赛,但它会简单地扔掉捕获组看来.

var matches2 = /#(.*?)#/g.exec(test);
Run Code Online (Sandbox Code Playgroud)

.exec方法显然只返回0数组位置中第一个结果的匹配字符串,以及该位置中该匹配的唯一捕获组1.

我已经筋疲力尽,谷歌和MDN正在寻找无济于事的答案.

所以,我的问题是,有没有更好的方法来存储匹配的捕获组,而不是通过它来.exec调用array.push以存储捕获的组?

我上面测试的预期数组应该是:

 [0] => (string) foo
 [1] => (string) foo
 [2] => (string) foo
Run Code Online (Sandbox Code Playgroud)

如果您发布JSFiddle,则接受纯JS和jQuery答案,额外的cookie console.log.=]

javascript regex

14
推荐指数
2
解决办法
8424
查看次数

检查JS是否可以访问iframe的文档

有没有标准的方法来知道我的脚本是否可以访问iframe文档?

我在网上找不到任何东西所以我想出了这个:

function checkifr() {
    function errHandler() {
        alert('Error. Try again later.');
    }
    var ifr = $('#ifr')[0]; //the iframe DOM element

    try {
        var d = ifr.contentWindow || ifr.contentDocument;
        if (!d) {
            errHandler();
            return false;
        }

        var b = $('#ifr').contents().find('body');
        //... manipulate iframe content

    } catch(e) {
        errHandler();
    }
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,当我尝试访问iframe内容并最终在catch块中时,Firefox会抛出错误.Chrome Unsafe JavaScript attempt to access frame在控制台中显示警告但从未进入catch阻止状态,它似乎会返回null这些尝试,因此初始if (!d)处理它.Opera和IE的行为类似于FF.编辑:使用上面的代码,现在Chrome返回一个"空"Window对象(没有属性),它不会触发我的if块.检查Esailija的答案,它可以很好地跨浏览器!

这是小提琴. …

javascript iframe jquery same-origin-policy

14
推荐指数
1
解决办法
5760
查看次数