title: "前端可用" post_status: publish comment_status: open taxonomy: category: - elementor-developers-docs post_tag: - Editor Controls - Src - Repos


前端可用

在某些情况下,开发者需要在前端加载的小部件 JS 中使用控件值。例如,一个使用外部滑块库的 Elementor 小部件需要获取要显示的幻灯片数量,并将数据传递给前端库脚本。Elementor 允许开发者公开控件值以供前端使用。

前端可用参数

编辑器拥有数百个控件。在前端暴露所有控件可能导致性能问题。因此默认情况下,所有控件值在前端都不可用。开发者可以通过明确选择哪些控件数据将在前端可用,来覆盖此设置。这通过使用 frontend_available 参数实现。

```php{7} $this->add_control( 'unique-control-name', [ 'label' => esc_html__( 'Control Label', 'textdomain' ), 'type' => \Elementor\Controls_Manager::NUMBER, 'default' => 100, 'frontend_available' => true, ] );

默认情况下,`frontend_available` 设置为 `false`。开发者可以通过将其设置为 `true` 来覆盖此设置。

## Fetch Control Data

Each widget can load [custom script handlers](src/widgets/widget-dependencies) which are loaded dynamically if the widget is used in the page.

```php{30-34}
<?php
/**
 * Register Elementor test widget.
 *
 * Include widget file and register widget class.
 *
 * @since 1.0.0
 * @param \Elementor\Widgets_Manager $widgets_manager Elementor widgets manager.
 * @return void
 */
function elementor_test_widget_registration( $widgets_manager ) {

    require_once( __DIR__ . '/widgets/test-widget.php' );

    $widgets_manager->register( new \Elementor_Test_Widget() );

}
add_action( 'elementor/widgets/register', 'elementor_test_widget_registration' );

/**
 * Register Elementor test widget dependencies.
 *
 * Registers all the scripts and styles to be enqueued later.
 *
 * @since 1.0.0
 * @return void
 */
function elementor_test_widget_dependencies() {

    wp_register_script(
        'test-widget-handler',
        plugins_url( 'js/test-widget.js', __FILE__ ),
        [ 'elementor-frontend' ] // Dependent on 'elementor-frontend' script.
    );

}
add_action( 'wp_enqueue_scripts', 'elementor_test_widget_dependencies' );

```php{39-41,62,67,85,99}

start_controls_section( 'content_section', [ 'label' => esc_html__( 'Content', 'textdomain' ), 'tab' => \Elementor\Controls_Manager::TAB_CONTENT, ] ); $this->add_control( 'some_number', [ 'label' => esc_html__( 'Some Number', 'textdomain' ), 'type' => \Elementor\Controls_Manager::NUMBER, 'default' => 100, 'frontend_available' => true, ] ); $this->end_controls_section(); } /** * Render widget output on the frontend. * * Written in PHP and used to generate the final HTML. * * @since 1.0.0 * @access protected */ protected function render(): void { ?>
    <div class="test-widget"></div>
    <?php
}

/* * Render widget output in the editor. * * Written as a Backbone JavaScript template and used to generate the live preview. * * @since 1.0.0 * @access protected / protected function content_template(): void { ?>

<?php }

}

Please note that the widget's `render()` method does not display any output. We want to insert the data from the control using JS. To do that, we registered a JS script located in `js/test-widget.js`, using the `get_style_depends()` method.

Now, the widget JS handler class should extend the `elementorModules.frontend.handlers.Base` class. This base class acts as an "abstract" class, defining basic methods like `onInit()` and providing access to the exposed control data using `getElementSettings()`.

```js
/**
 * Test Widget JS Handler Class
 */
class TestWidgetHandler extends elementorModules.frontend.handlers.Base {

    /**
     * Update Test Widget Content
     *
     * Custom method used by test-widget that inserts the control value using JS.
     */
    updateTestWidgetContent() {
        if ( ! this.contentWrapper ) {
            const widgetUniqueSelector = `div[data-id="${this.getID()}"] .test-widget`;
            this.contentWrapper = document.querySelector( widgetUniqueSelector );
        }

        this.contentWrapper.innerText = this.getElementSettings( 'some_number' );
    }

    /**
     * On Init
     *
     * Runs when the widget is loaded and initialized in the frontend.
     */
    onInit() {
        this.updateTestWidgetContent();
    }

    /**
     * On Element Change
     *
     * Runs every time a control value is changed by the user in the editor.
     *
     * @param {string} propertyName - The ID of the control that was changed.
     */
    onElementChange( propertyName ) {
        if ( 'some_number' === propertyName ) {
            this.updateTestWidgetContent();
        }
    }

}

/**
 * Register JS Handler for the Test Widget
 *
 * When Elementor frontend was initiated, and the widget is ready, register the widet
 * JS handler.
 */
window.addEventListener( 'elementor/frontend/init', () => {
    const addHandler = ( $element ) => {
        elementorFrontend.elementsHandler.addHandler( TestWidgetHandler, { $element } );
    };

    elementorFrontend.hooks.addAction( 'frontend/element_ready/test_widget.default', addHandler );
} );