古腾堡-自定义块onClick不起作用?

时间:2020-01-16 作者:user435245

我正在尝试为古腾堡编辑器开发一个自定义块。我试图显示一个按钮并调用一个web服务,然后将用户重定向到返回的URL。有人能帮我解释一下为什么没有调用我的click handler函数吗?

wp.blocks.registerBlockType(\'brad/border-box\', {
    title: \'Simple Box\',
    icon: \'smiley\',
    category: \'common\',
    attributes: {
        content: {type: \'string\'},
},

/* This configures how the content and color fields will work, and sets up the necessary elements */

edit: function (props) {
    function updateContent(event) {
        props.setAttributes({content: event.target.value})
    }

    return React.createElement(
        "div",
        null,
        React.createElement(
            "h3",
            null,
            "Simple Box"
        ),
        React.createElement("input", {type: "number", value: props.attributes.content, onChange: updateContent}),
    );
},


save: function (props) {
    function clickHandler(event) {
        alert(\'clicked\')
    }

    return wp.element.createElement(
        "button",
        {style: {padding: \'4px\', border: \'2px solid black\'}, onClick: {clickHandler}},
        "Click On Me"
    );
}
})

1 个回复
最合适的回答,由SO网友:WebElaine 整理而成

块编辑器的save() 函数不会将JS函数保存到要在前端运行的数据库中。要在前端运行JS,需要将其另存为单独的文件,并在前端显式将该文件排队。

记住这一点,重写save() 函数,而不是试图直接调用函数,它有一个特定的CSS类,您可以将其作为目标。

save: function (props) {
    return wp.element.createElement(
        "button",
        {style: {padding: \'4px\', border: \'2px solid black\'}, class: \'clicker\'},
        "Click On Me"
    );
}
然后调整函数并将其保存在自己的clicker.js 文件:

(function($) {
    $(document).ready(function(){
        // Add a click handler to just these buttons
        $(\'button.clicker\').on(\'click\', clickHandler);
        // Define the clickHandler function, as before
        function clickHandler(event) {
            alert(\'clicked\')
        }
    });
})(jQuery);
最后,要将单独的JS排队,请编辑PHP文件:

add_action(\'init\', \'wpse_add_front_end_clicker_script\');
function wpse_add_front_end_clicker_script() {
    wp_enqueue_script(
        \'clicker\',
        plugins_url(\'clicker.js\', __FILE__),
        array(\'jquery\'),
        filemtime( plugin_dir_path( __FILE__ ) . \'clicker.js\' ),
        true
    );
}
这将使用jQuery依赖项将文件排队,并给它加上时间戳,因此如果您更新JS,它应该避免停留在缓存中。(您可能需要调整上面的一些代码,因为我还没有全部测试过,但这应该会让您走上正确的道路!)

相关推荐