2

我想使用 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);
}

Javascript

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});
    }
}

上面的代码在颜色框中显示一切正常,除了这部分丢失了<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/脚本\u003E

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

脚本标签已从数据中删除。仍在试图弄清楚为什么解析器会删除 javascript 标记?

4

1 回答 1

1

jQuery(function($){...});是一个捷径$(document).ready(function(){...});

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

最好的办法是单独托管您的 javascript 并$.getScript()success()回调中调用 a

如果脚本部分本身缺失,那么您可以通过这种方式创建 JSON 对象,

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

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

你也必须摆脱jQuery(function($){})一部分

于 2012-12-20T17:43:52.247 回答