You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React更新DOM后,jQuery无法获取.wpgmp-map-data-container元素

问题:React动态更新DOM后,jQuery无法获取目标元素

我在React组件中通过dangerouslySetInnerHTML插入了包含类名wpgmp-map-data-container的DOM结构,但调用全局函数wpgmpInitMap用jQuery查询该类元素时,结果始终返回长度0,明明该元素已经存在于DOM中。

相关代码:

edit.js(React组件)

export default function Edit({ attributes, setAttributes }) {
    const [mapMarkupState, setMapMarkupState] = useState("");

    const fetchMapMarkup = async (id) => {
        try {
            const response = await fetch(
                `${siteurl}/wp-json/wpgmp/${version}/markup/${id}`,
            );
            const markupData = await response.json();
            setMapMarkupState(markupData.map_markup);
        } catch (error) {
            console.error("Error fetching map markup:", error);
        }
    };
    
    useEffect(() => {
        fetchMapMarkup(id);
    }, []);

    useEffect(() => {
        if(mapMarkupState ){
            wpgmpInitMap();
        }
    }, [mapMarkupState]);

    return (
        <>
        <div dangerouslySetInnerHTML={{ __html: mapMarkupState }} />
        </>
    );
}

maps.js(全局jQuery函数)

function wpgmpInitMap() {
    jQuery(document).ready(function($) {
        console.log( 'Length = ',$(".wpgmp-map-data-container").length );
    });
}

问题原因:

jQuery(document).ready()只会在初始页面DOM加载完成时触发一次。而React是在初始页面加载完成后,通过dangerouslySetInnerHTML动态插入DOM的,此时调用wpgmpInitMap,里面的document.ready回调已经不会再执行了,导致查询代码根本没运行,所以返回长度0。

解决方案:

直接移除jQuery(document).ready()的包裹,因为调用wpgmpInitMap的时机已经是React完成DOM更新之后,不需要再等待页面加载完成:

修改后的wpgmpInitMap:

function wpgmpInitMap() {
    const $ = jQuery;
    console.log( 'Length = ', $(".wpgmp-map-data-container").length );
}

额外验证(可选):

如果还是有问题,可以给React的容器div添加ref,确认DOM确实已经渲染:

// 在Edit组件中添加ref
const mapContainerRef = useRef(null);

useEffect(() => {
    if(mapMarkupState && mapContainerRef.current){
        // 打印容器内的HTML,确认目标元素存在
        console.log(mapContainerRef.current.innerHTML);
        wpgmpInitMap();
    }
}, [mapMarkupState]);

return (
    <div ref={mapContainerRef} dangerouslySetInnerHTML={{ __html: mapMarkupState }} />
);

内容的提问来源于stack exchange,提问作者vinay deora

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 09:35:19