我想使用json和jquery显示图像预览和标题。我的PHP脚本对json数据进行编码,然后发送给jquery进行预览。数据包含html和javascript。在预览中,我看到了HTML,但是省略了javascript标签。我相信json解析器会删除此标签。这是我的代码

PHP代码

$code = '
<div class="mosaic-block bar">
     <div class="mosaic-overlay">
         <div class="details">
              <h4>Sloppy Art - A Mess of Inspiration</h4>
              <p>via the Nonsense Society</p>
         </div>
     </div>
     <div class="mosaic-backdrop"><img src="http://buildinternet.s3.amazonaws.com/projects/mosaic/florian.jpg"/></div>
</div>
<script type="text/javascript">jQuery(function($){$(".bar").mosaic();});</script>';

$json_msg = array('success'=>true, 'msg'=> $code);
echo encode_json($json_msg);
exit;

function encode_json ($mixed_data) {
    if(is_array($mixed_data) && isset($mixed_data['msg'])) {
        $mixed_data['msg'] = utf8_encode($mixed_data['msg']);
    }
    return json_encode($mixed_data, JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_QUOT);
}


Java脚本

var form_options = {
    success:        ShowPreview,
    url:            url,
    type:           'post',
    dataType:       'json',
    clearForm:      false,
    resetForm:      false,
    cache:          false,
    timeout:        200000,
};
$('.preview-form').ajaxSubmit(form_options);


function ShowPreview(data) {
    if(data.success){
        $.fn.colorbox({html:data.msg});
    }
}


上面的代码在colorbox中显示一切正常,除了缺少这部分<script type="text/javascript">jQuery(function($){$(".bar").mosaic();});</script>如何逃脱由json解析器解析的JavaScript?

编辑

我可以确认问题出在json解析器上。我在表单提交选项中将数据类型从json更改为HTML,然后在响应中找到了以下编码字符串
E \ u003Cscript type = \ u0022text / javascript \ u0022 \ u003EjQuery(function($){$(\ u0022.bar \ u0022).mosaic();}); \ u003C / script \ u003E

我使用以下代码将数据还原为json
var data = jQuery.parseJSON(msg);

脚本标签已从数据中删除。仍在尝试找出解析器为何删除javascript标记的原因?

最佳答案

jQuery(function($){...});$(document).ready(function(){...});的快捷方式

这意味着jQuery(function($){$(".bar").mosaic();});仅在ready()事件时执行。由于您是在颜色框内加载代码,因此ready()事件已被触发,此代码段将永远不会触发。

最好的选择是分别托管您的JavaScript并在$.getScript()回调上调用success()

如果缺少脚本部分本身,则可以通过这种方式创建JSON对象,

{
    html: "some html",
    js: "some js"
}


然后eval() javascript代码。 (是的,它的安全性很差)

另外,您还必须摆脱jQuery(function($){})部分

10-05 20:33
查看更多