小编And*_*lly的帖子

在Javascript中构建HTML字符串真的不安全吗?

托管我们网站的公司在部署之前审查我们的代码 - 他们最近告诉我们这个:

永远不应该直接操纵HTML字符串,因为这会打开我们潜在的XSS漏洞.相反,总是使用DOM api创建元素......可以是jQuery或直接DOM api.

例如,而不是

this.html.push( '<a class="quiz-au" data-src="' + this.au + '"><span class="quiz-au-icon"></span>Click to play</a>' ); 
Run Code Online (Sandbox Code Playgroud)

他们告诉我们这样做

var quizAuLink = $( 'a' );
quizAuLink.addClass( 'quiz-au' );
quizAuLink.data( 'src', this.au );
quizAu.text( 'Click to play' );
quizAu.prepend( '<span class="quiz-au-icon"></span>' );
Run Code Online (Sandbox Code Playgroud)

这是真的吗?任何人都可以给我们一个XSS攻击的例子,它可以像第一个那样利用HTML字符串吗?

html javascript security xss

47
推荐指数
3
解决办法
4390
查看次数

带有history.pushState和popstate的Ajax - 当popstate state属性为null时,我该怎么办?

我正在尝试使用ajax加载内容的HTML5历史API.

我有一堆通过相关链接连接的测试页面.我有这个JS,它处理这些链接的点击.当单击链接时,处理程序获取其href属性并将其传递给ajaxLoadPage(),该页面将所请求页面中的内容加载到当前页面的内容区域中.(我的PHP页面设置为在正常请求时返回完整的HTML页面,但只有一大块内容,如果?fragment = true附加到请求的URL.)

然后我的click处理程序调用history.pushState()以在地址栏中显示URL并将其添加到浏览器历史记录中.

$(document).ready(function(){

    var content = $('#content');

    var ajaxLoadPage = function (url) {
        console.log('Loading ' + url + ' fragment');
        content.load(url + '?fragment=true');
    }

    // Handle click event of all links with href not starting with http, https or #
    $('a').not('[href^=http], [href^=https], [href^=#]').on('click', function(e){

        e.preventDefault();
        var href = $(this).attr('href');
        ajaxLoadPage(href);
        history.pushState({page:href}, null, href);

    });

    // This mostly works - only problem is when popstate happens and state is null
    // e.g. when we try to go back …
Run Code Online (Sandbox Code Playgroud)

javascript jquery html5 browser-history html5-history

21
推荐指数
3
解决办法
4万
查看次数

Vanilla JS事件委托 - 处理目标元素的子元素

我正试图在vanilla JS中进行事件委托.我有一个像这样的容器内的按钮

<div id="quiz">
    <button id="game-again" class="game-again"><span class="icon-spinner icon"></span><span>Go again</span></button>
</div>
Run Code Online (Sandbox Code Playgroud)

按照David Walsh的不错说明,我正在向按钮的祖先添加一个事件处理程序,如下所示:

this.container.addEventListener('click', function(e){
    if (e.target && e.target.id == 'game-again') {
        e.stopPropagation();
        self.publish('primo:evento');
    }
});
Run Code Online (Sandbox Code Playgroud)

this.container是#quiz元素.这有一半的时间,但其余的时间click事件的目标是按钮内的跨度之一,所以我的事件处理程序不会被调用.处理这种情况的最佳方法是什么?

javascript dom publish-subscribe event-delegation

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

将多个参数传递给console.log

我有一个实用程序函数,它用一个条件包装console.log,所以如果我们在dev环境中并且console.log存在,我们只调用console.log:

/* Console log if environment has debug true or #debug initially passed in URL */
metro.conlog = (function () {
    return function (message) {
        if ((metro.siteData.debug || metro.hashOptions.hasOwnProperty('debug')) && window.console && message) {
            console.log(message);
        }
    };
}());
Run Code Online (Sandbox Code Playgroud)

这对于普通的控制台日志非常有效.但是我最近发现了向console.log传递多个参数的乐趣:它允许您使用字符串为控制台日志添加前缀,因此console.log('DEBUG', object)输出字符串以及可以检查其属性的可扩展对象.如何更改我的conlog功能来执行此操作?我已经尝试注销这样的所有参数:

metro.conlog = (function () {
    return function (message) {
        if ((metro.siteData.debug || metro.hashOptions.hasOwnProperty('debug')) && window.console && message) {
            console.log(arguments);
        }
    };
}());
Run Code Online (Sandbox Code Playgroud)

但是这会将参数作为数组输出,而不是使用console.log获得的整齐线.您可以在此屏幕截图中看到差异:

在此输入图像描述

谁能告诉我如何重现原始日志输出?

javascript console firebug developer-tools

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

浮动两个50%宽度的div,其间的间距为10px

我想在我的页面上浮动一对流体div,每个占据容器宽度的一半,但它们之间的间隔为10px.我已经完成了这个JSFiddle http://jsfiddle.net/andfinally/sa53B/5/,这里是HTML:

<div class="clearfix">
    <a class="prev" href="#">Previous</a>
    <a class="next" href="#">Next</a>
</div>
Run Code Online (Sandbox Code Playgroud)

和CSS:

.prev {
    background: black;
    color: white;
    font-size: 16px;
    margin-bottom: 10px;
    display: block;
    float: left;
    box-sizing: border-box;
    width: 50%;
    margin-right: 5px;
}

.next {
    background: black;
    color: white;
    font-size: 16px;
    margin-bottom: 10px;
    display: block;
    float: right;
    box-sizing: border-box;
    width: 50%;
    margin-left: 5px;
}
Run Code Online (Sandbox Code Playgroud)

盒子大小规则不足以使这项工作 - div超过50%宽.在这个问题的答案之一,有人建议使用CSS display-table.任何人都可以解释如何在这种情况下做这项工作?

谢谢!

html css css3

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

FlexSlider 2在窗口大小调整大小时调整大小

我正在为Twitter Bootstrap上构建的WordPress制作一个响应主题.我在主页上使用FlexSlider幻灯片jquery插件.

不幸的是,当我调整浏览器大小时,FlexSlider不会优雅地调整大小.当我变窄时,图像很容易被裁掉......如果我走得更宽,下一张图像的一部分可能会出现在侧面.即使我使用FlexSlider网站上的演示代码,也会发生这种情况.它甚至发生在FlexSlider演示中.但Dany Duchaine的[Energized theme] [3]设法在视口改变时很好地调整FlexSlider的大小.任何人都可以解释他是如何做到这一点,或建议我可以改善我的版本的行为?

谢谢!

javascript css jquery responsive-design twitter-bootstrap

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

更改Docker Quickstart终端的终端应用程序

我刚刚在OSX上安装了Docker Toolbox,第一次启动Docker Quickstart终端时,它促使我选择打开哪个终端.我愚蠢地选择了iTerm.现在,这些天实现了我常用的终端是终端,我想改变那个设置.但我没做什么似乎重置它.

我已经尝试再次运行Docker Toolbox的安装程序.我也尝试从https://github.com/docker/toolbox/blob/master/osx/uninstall.sh运行卸载脚本,然后重新安装.但是每次我点击Docker Quickstart终端,它都会在iTerm中启动.

谁能告诉我如何改变这种偏好?

macos terminal iterm docker docker-toolbox

13
推荐指数
1
解决办法
4034
查看次数

指南针output_style

有没有人找到任何关于Compass中output_style的不同值的含义的文档?选项包括:expanded,:nested,:compact和:compressed.我可以看到最后一个是什么,但其他人做了什么?

似乎有点浪费,我必须重新编译我的所有CSS,以弄清楚这些不同的选项产生了什么.

css sass compass-sass

12
推荐指数
1
解决办法
1万
查看次数

Backbone集合提取数据,但不设置模型

我正在尝试从本地API填充我的Backbone集合并更改视图以显示数据.我的集合中的fetch()调用似乎成功了,并且抓取了数据,但是fetch操作不会更新集合中的模型.

这就是我的模型和收藏品:

var Book = Backbone.Model.extend();

var BookList = Backbone.Collection.extend({

    model: Book,
    url: 'http://local5/api/books',

    initialize: function(){
        this.fetch({
            success: this.fetchSuccess,
            error: this.fetchError
        });
    },

    fetchSuccess: function (collection, response) {
        console.log('Collection fetch success', response);
        console.log('Collection models: ', this.models);
    },

    fetchError: function (collection, response) {
        throw new Error("Books fetch error");
    }

});
Run Code Online (Sandbox Code Playgroud)

我已经完成了这样的观点:

var BookView = Backbone.View.extend({

    tagname: 'li',

    initialize: function(){
        _.bindAll(this, 'render');
        this.model.bind('change', this.render);
    },

    render: function(){
        this.$el.html(this.model.get('author') + ': ' + this.model.get('title'));
        return this;
    }

});

var BookListView = Backbone.View.extend({

    el: …
Run Code Online (Sandbox Code Playgroud)

javascript json backbone.js backbone-views

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

JQuery相当于MooTools绑定(这个)

我正在尝试使用此类插件在JQuery中重写Mootools工具提示类.当我的类被实例化时,我将一个事件监听器附加到目标链接,这将淡出工具提示.

在事件回调中,JQuery将关键字"this"分配给事件的目标,因此要保持对我正在使用的类的属性的引用apply()将"this"设置为表示类实例.这显然是Mootools的方便bind()函数的JQuery中的对应物.

不幸的是,当我使用apply()时,我丢失了回调的事件参数.例如,在这一位,我在第二行得到"e is undefined"错误.

this.target.bind('click', function(e){
    e.preventDefault();
    var tip = this.opts.tip;
    tip.fadeOut(500, function(){
        tip.bind('click', function(){
            showing = false;
        })
    });
}.apply(this))
Run Code Online (Sandbox Code Playgroud)

我在这里错过了一招吗?有没有人知道解决这个问题的方法?

谢谢Fred

javascript jquery mootools javascript-events

11
推荐指数
1
解决办法
4185
查看次数