javascript - Three.js 通过 iframe 传递事件(onMessage)

标签 javascript iframe

嘿,总的来说,我对 Three.js 和 js 还很陌生, 所以我知道我的代码无论如何都不完美,但即使到达这里对我来说也是一个很好的进步。

无论如何,我的 Three.js 场景是使用 iFrame 放置在网站中的。 然后我想从网站本身控制相机位置。 带按钮。

我基本上所做的是编写一个 window.onmessage 函数 当从网站本身触发时,调用 iFrame 中的 Three.js 中的函数。

但是,无论我做什么或将消息放置在何处,都不会发生任何情况。 我还尝试直接向 Three.js 场景文件添加一个按钮,但这也没有效果,所以我知道我缺少了一些可能与 iFrame 无关的东西,但我不知道是什么。

这些是我在 Three.js init 函数中的 onmessage 事件

window.onmessage - function(evt) {
    if (evt.data === 'setCamera01') {
        cameraPos = 300;
    }
}

window.onmessage - function(evt) {
    if (evt.data === 'setCamera02') {
        cameraPos = 0;
    }
}

window.onmessage - function(evt) {
    if (evt.data === 'setCamera03') {
        cameraPos = -300;
    }
}

这是我在 iFrame 所在的网站中放置的代码(#html2 是 IFrame)

export function button03_click(event, $w) {
    $w("#html2").postMessage('setCamera03');
    console.log("cameraPos = -300");
}

export function button02_click(event, $w) {
    $w("#html2").postMessage('setCamera03');
    console.log("cameraPos = 0");
}

export function button01_click(event, $w) {
    $w("#html2").postMessage('setCamera03');
    console.log("cameraPos = 300");
}

最后在渲染函数中我放置了这一行

camera.position.y = cameraPos;

在这里你可以看到完整的 Three.js 代码 (请注意,由于保密协议(protocol),我删除了模型和纹理的网址,因此您将看不到任何东西)我感谢任何帮助,谢谢!

<html>
<head>

<title>WebGL iFrame Test</title>

<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">

<script src="https://threejs.org/build/three.min.js"></script>
<script src="https://threejs.org/build/three.js"></script>

<style>
body {
    overflow: hidden;
    margin: 0;
    padding: 0;
    background-color: transparent;
    ;
}
.preloader {
    position: fixed;
    width: 32px;
    left: calc(50vw - 16px);
    top: calc(50vh - 16px);
    height: 32px;
    z-index: 99999;
}
.container {
    opacity: 0;
    transition: opacity 1.0s ease-out 0.5s;
}
</style>
</head>

<body>
<script>

    /* Global vars
    ---------------------------------------------------
    */

    var SCREEN_WIDTH = window.innerWidth;
    var SCREEN_HEIGHT = window.innerHeight;

    var camera, scene;
    var canvasRenderer, webglRenderer;
    var models_loaded = false;
    var textures_loaded = false;
    var container, mesh, geometry, loader, preloader;

    var cameraPos = 300;

    var windowHalfX = window.innerWidth / 2;
    var windowHalfY = window.innerHeight / 2;

    var light;



    var mouseX = 0, mouseY = 0;

    /* 
    ---------------------------------------------------
    */





    /* Global materials and lighting controls
    ---------------------------------------------------
    */

    //material
    var roughness = 0.83;
    var metal = 0.8;
    var diffuse = 0x675f00;

    //lights
    var environmentInt = 0.5;

    var ambiLightInt = 0.2;
    var dirLightInt = 1.2;
    var dirLightScalar = 1;
    var hemiLightInt = 1;

    /* 
    ---------------------------------------------------
    */





    /* Page Preloader
    ---------------------------------------------------
    */

    preloader = document.createElement('img');
    preloader.onload = function(){
        window.addEventListener("mousemove", onmousemove, false);
        init();
        animate();
    }
    preloader.src = "textures_512/preloader.gif";
    preloader.className = "preloader";
    document.body.appendChild(preloader);

    /* 
    ---------------------------------------------------
    */





    /* init start
    -----------------------------------------------------------------------------------------------------------------------------
    */

    function init() {


        /* 3D Json Loader
        ---------------------------------------------------
        */

        container = document.createElement('div');
        container.className = 'container';
        container.style.visibility = 'hidden';
        document.body.appendChild(container);

        var manager = new THREE.LoadingManager();

        manager.onStart = function ( url, itemsLoaded, itemsTotal ) {
            console.log( 'Started loading file: ' + url + '.\nLoaded ' + itemsLoaded + ' of ' + itemsTotal + ' files.' );
        };

        function onComplete(){
            if(models_loaded && textures_loaded){
                document.body.removeChild(preloader);
                container.style.visibility = 'visible';
                container.style.opacity =1;
                SITE_BACKGROUNDcurrentVideovideo.play();
                console.log( 'Loading completed');
            }
        }

        manager.onLoad = function ( ) {
            models_loaded = true;
            onComplete();
        };

        manager.onProgress = function ( url, itemsLoaded, itemsTotal ) {
            //console.log( 'Loading file: ' + url + '.\nLoaded ' + itemsLoaded + ' of ' + itemsTotal + ' files.' );
        };


        manager.onError = function ( url ) {
            //console.log( 'There was an error loading ' + url );
        };


        loader = new THREE.JSONLoader(manager);

        /* 
        ---------------------------------------------------
        */




        /* Creating the camera
        ---------------------------------------------------
        */

        camera = new THREE.PerspectiveCamera(20, window.innerWidth / window.innerHeight, 10, 1500);
        camera.position.z = 340;




        /* Passing event (in the init function ?) through the iFrame
        ---------------------------------------------------
        */

        window.onmessage - function(evt) {
            if (evt.data === 'setCamera01') {
                cameraPos = 300;
            }
        }

        window.onmessage - function(evt) {
            if (evt.data === 'setCamera02') {
                cameraPos = 0;
            }
        }

        window.onmessage - function(evt) {
            if (evt.data === 'setCamera03') {
                cameraPos = -300;
            }
        }




        /* Bulding the scene
        ---------------------------------------------------
        */

        scene = new THREE.Scene();

        //Lights
        scene.add(new THREE.AmbientLight(0xffffff, ambiLightInt));


        /* Main light
        ---------------------------------------------------
        */

        light = new THREE.DirectionalLight(0xffffff, dirLightInt);
        //light.position.set(100, -350, 0);
        light.position.multiplyScalar(dirLightScalar);

        //light.position.x = 100;
        light.position.y = 100;
        light.position.z = 100;


        //Shadow parameters 
        light.castShadow = true;
        light.shadowCameraVisible = true;
        //light.shadowBias = 0.001;

        light.shadowMapWidth = 1024;
        light.shadowMapHeight = 1024;

        //Shadow camera fov and position
        var d = 50;

        light.shadowCameraLeft = -d;
        light.shadowCameraRight = d;
        light.shadowCameraTop = d;
        light.shadowCameraBottom = -d;

        light.shadowcameranear = 0.1;
        light.shadowCameraFar = 2000;
        light.shadowcamerafov = 30;
        light.shadowDarkness = 0;

        scene.add(light);

        /* 
        ---------------------------------------------------
        */


        //Skylight
        var skylight = new THREE.HemisphereLight( 0xffffff, 0x080820, hemiLightInt );
        scene.add( skylight );






        /* Texture Loader
        ---------------------------------------------------
        */

        var tx_manager = new THREE.LoadingManager();
        tx_manager.onStart = function ( url, itemsLoaded, itemsTotal ) {
            //console.log(itemsTotal);
            //console.log( 'Started loading file: ' + url + '.\nLoaded ' + itemsLoaded + ' of ' + itemsTotal + ' files.' );
        };
        var total_textures = 0
        tx_manager.itemEnd=function (url){
            total_textures++;
            if(total_textures == 20){
                textures_loaded = true;
                onComplete();
            }
            //console.log(++total_textures);
        }
        tx_manager.onLoad = function ( x) {
            console.log(textureLoader);
            //console.log( 'tx_manager complete!');

        };

        var textureLoader = new THREE.TextureLoader(tx_manager);


        /*
        ---------------------------------------------------
        */






        /* Environment map images
        ---------------------------------------------------
        */

        var envUrls = [
        'textures/env/02/px.jpg',
        'textures/env/02/nx.jpg',
        'textures/env/02/py.jpg',
        'textures/env/02/ny.jpg',
        'textures/env/02/pz.jpg',
        'textures/env/02/nz.jpg'
        ],

        // wrap it up into the object that we need
        cubemap = THREE.ImageUtils.loadTextureCube(envUrls);

        // set the format, likely RGB unless you've gone crazy
        cubemap.format = THREE.RGBFormat;

        /*
        ---------------------------------------------------
        */






        /* 3D Json files loading
        ---------------------------------------------------
        */

        // TRUNK 01
        loader.load( "models/trunk_01.json", function( geometry, mat ) {

                        //var trunk_color = 0x0061ff;
                        //var trunk_01_color = textureLoader.load( "textures/trunk_01_curvature.jpg" );
                        var trunk_01_normal = textureLoader.load( "textures_512/trunk_01_normal.jpeg" );
                        var trunk_01_roughness = textureLoader.load( "textures_512/trunk_01_roughness.jpeg" );

                    trunk_01_Material = new THREE.MeshPhysicalMaterial( {
                            roughnessMap: trunk_01_roughness,
                            normalMap: trunk_01_normal, 
                            map: null,
                            color: diffuse,
                            metalness: metal,
                            roughness: roughness,
                            envMap: cubemap,
                            envMapIntensity: environmentInt
                        } );

                        var trunk_01 = new THREE.Mesh( geometry, mat );
                        trunk_01.material = trunk_01_Material;
                        trunk_01.scale.set( 1, 1, 1 );
                        trunk_01.position.x = 0;
                        trunk_01.position.z = 0;
                        trunk_01.position.x = 0;
                        trunk_01.castShadow = true;
                        trunk_01.receiveShadow = true;
                        trunk_one = trunk_01;
                        scene.add( trunk_01 );
        } );

        // TRUNK 02
        loader.load( "models/trunk_02.json", function( geometry, mat ) {

                        //var trunk_02_color = textureLoader.load( "textures/trunk_02_curvature.jpg" );
                        var trunk_02_normal = textureLoader.load( "textures_512/trunk_02_normal.jpeg" );
                        var trunk_02_roughness = textureLoader.load( "textures_512/trunk_02_roughness.jpg" );

                    trunk_02_Material = new THREE.MeshPhysicalMaterial( {
                            roughnessMap: trunk_02_roughness,
                            normalMap: trunk_02_normal, 
                            map: null,
                            color: diffuse,
                            metalness: metal,
                            roughness: roughness,
                            envMap: cubemap,
                            envMapIntensity: environmentInt
                        } );

                        var trunk_02 = new THREE.Mesh( geometry, mat );
                        trunk_02.material = trunk_02_Material;
                        trunk_02.scale.set( 1, 1, 1 );
                        trunk_02.position.x = 0;
                        trunk_02.position.z = 0;
                        trunk_02.position.x = 0;
                        trunk_02.castShadow = true;
                        trunk_02.receiveShadow = true;
                        trunk_two = trunk_02;
                        scene.add( trunk_02 );
        } );

        // LEAFS
            loader.load( "models/leafs.json", function( geometry, mat ) {

                        //var leafs_color = textureLoader.load( "textures/leafs_curvature.jpg" );
                        var leafs_normal = textureLoader.load( "textures_512/leafs_normal.jpeg" );
                        var leafs_roughness = textureLoader.load( "textures_512/leafs_roughness.jpeg" );

                    leafs_Material = new THREE.MeshPhysicalMaterial( {
                            roughnessMap: leafs_roughness,
                            normalMap: leafs_normal, 
                            map: null,
                            color: diffuse,
                            metalness: metal,
                            roughness: roughness,
                            envMap: cubemap,
                            envMapIntensity: environmentInt
                        } );

                        var leafs = new THREE.Mesh( geometry, mat );
                        leafs.material = leafs_Material;
                        leafs.scale.set( 1, 1, 1 );
                        leafs.position.x = 0;
                        leafs.position.z = 0;
                        leafs.position.x = 0;
                        leafs.castShadow = true;
                        leafs.receiveShadow = true;
                        all_leafs = leafs;
                        scene.add( leafs );
        } );

        // ROSES
        loader.load( "models/roses.json", function( geometry, mat ) {

                        //var roses_color = textureLoader.load( "textures/roses_curvature.jpg" );
                        var roses_normal = textureLoader.load( "textures_512/roses_normal.jpeg" );
                        var roses_roughness = textureLoader.load( "textures_512/roses_roughness.jpeg" );

                    roses_Material = new THREE.MeshPhysicalMaterial( {
                            roughnessMap: roses_roughness,
                            normalMap: roses_normal,
                            normalScale: new THREE.Vector2( 0.7, 0.7 ),
                            map: null,
                            color: diffuse,
                            metalness: metal,
                            roughness: roughness,
                            envMap: cubemap,
                            envMapIntensity: environmentInt
                        } );

                        var roses = new THREE.Mesh( geometry, mat );
                        roses.material = roses_Material;
                        roses.scale.set( 1, 1, 1 );
                        roses.position.x = 0;
                        roses.position.z = 0;
                        roses.position.x = 0;
                        roses.castShadow = true;
                        roses.receiveShadow = true;
                        all_roses = roses;
                        scene.add( roses );
        } );

        // TOPS
        loader.load( "models/tops.json", function( geometry, mat ) {

                        //var tops_color = textureLoader.load( "textures/tops_curvature.jpg" );
                        var tops_normal = textureLoader.load( "textures_512/tops_normal.jpeg" );
                        var tops_roughness = textureLoader.load( "06/textures_512/tops_roughness.jpeg" );

                    tops_Material = new THREE.MeshPhysicalMaterial( {
                            roughnessMap: tops_roughness,
                            normalMap: tops_normal,
                            map: null,
                            color: diffuse,
                            metalness: metal,
                            roughness: roughness,
                            envMap: cubemap,
                            envMapIntensity: environmentInt
                        } );


                        var tops = new THREE.Mesh( geometry, mat );
                        tops.material = tops_Material;
                        tops.scale.set( 1, 1, 1 );
                        tops.position.x = 0;
                        tops.position.z = 0;
                        tops.position.x = 0;
                        tops.castShadow = true;
                        tops.receiveShadow = true;
                        all_tops = tops;
                        scene.add( tops );
        } );

        // STEMS
        loader.load( "models/stems.json", function( geometry, mat ) {

                        //var stems_color = textureLoader.load( "textures/stems_curvature.jpg" );
                        var stems_normal = textureLoader.load( "textures_512/stems_normal.jpeg" );
                        var stems_roughness = textureLoader.load( "textures_512/stems_roughness.jpeg" );

                    stems_Material = new THREE.MeshPhysicalMaterial( {
                            roughnessMap: stems_roughness,
                            normalMap: stems_normal,
                            map: null,
                            color: diffuse,
                            metalness: metal,
                            roughness: roughness,
                            envMap: cubemap,
                            envMapIntensity: environmentInt
                        } );

                        var stems = new THREE.Mesh( geometry, mat );
                        stems.material = stems_Material;
                        stems.scale.set( 1, 1, 1 );
                        stems.position.x = 0;
                        stems.position.z = 0;
                        stems.position.x = 0;
                        stems.castShadow = true;
                        stems.receiveShadow = true;
                        all_stems = stems;
                        scene.add( stems );
        } );    

        // THORNES 01
        loader.load( "models/thornes_01.json", function( geometry, mat ) {

                        //var thornes_01_color = textureLoader.load( "textures/thornes_01_curvature.jpg" );
                        var thornes_01_normal = textureLoader.load( "textures_512/thornes_01_normal.jpeg" );
                        var thornes_01_roughness = textureLoader.load( "textures_512/thornes_01_roughness.jpeg" );

                    thornes_01_Material = new THREE.MeshPhysicalMaterial( {
                            roughnessMap: thornes_01_roughness,
                            normalMap: thornes_01_normal,
                            map: null,
                            color: diffuse,
                            metalness: metal,
                            roughness: roughness,
                            envMap: cubemap,
                            envMapIntensity: environmentInt
                        } );

                        var thornes_01 = new THREE.Mesh( geometry, mat );
                        thornes_01.material = thornes_01_Material;
                        thornes_01.scale.set( 1, 1, 1 );
                        thornes_01.position.x = 0;
                        thornes_01.position.z = 0;
                        thornes_01.position.x = 0;
                        thornes_01.castShadow = true;
                        thornes_01.receiveShadow = true;
                        thornes_one = thornes_01;
                        scene.add( thornes_01 );
        } );

        // THORNES 02
        loader.load( "models/thornes_02.json", function( geometry, mat ) {

                        //var thornes_02_color = textureLoader.load( "textures/thornes_02_curvature.jpg" );
                        var thornes_02_normal = textureLoader.load( "textures_512/thornes_02_normal.jpeg" );
                        var thornes_02_roughness = textureLoader.load( "textures_512/thornes_02_roughness.jpeg" );

                    thornes_02_Material = new THREE.MeshPhysicalMaterial( {
                            roughnessMap: thornes_02_roughness,
                            normalMap: thornes_02_normal,
                            map: null,
                            color: diffuse,
                            metalness: metal,
                            roughness: roughness,
                            envMap: cubemap,
                            envMapIntensity: environmentInt
                        } );

                        var thornes_02 = new THREE.Mesh( geometry, mat );
                        thornes_02.material = thornes_02_Material;
                        thornes_02.scale.set( 1, 1, 1 );
                        thornes_02.position.x = 0;
                        thornes_02.position.z = 0;
                        thornes_02.position.x = 0;
                        thornes_02.castShadow = true;
                        thornes_02.receiveShadow = true;
                        thornes_two = thornes_02;
                        scene.add( thornes_02 );
        } );

        // SNAKE BOSY
        loader.load( "models/snake_body.json", function( geometry, mat ) {

                        //var snake_body_color = textureLoader.load( "textures/snake_body_curvature.jpg" );
                        var snake_body_normal = textureLoader.load( "textures_512/snake_body_normal.jpeg" );
                        var snake_body_roughness = textureLoader.load( "textures_512/snake_body_roughness.jpg" );

                    snake_body_Material = new THREE.MeshPhysicalMaterial( {
                            roughnessMap: snake_body_roughness,
                            normalMap: snake_body_normal,
                            normalScale: new THREE.Vector2( 1.5, 1.5 ),
                            map: null,
                            color: diffuse,
                            metalness: metal,
                            roughness: roughness,
                            envMap: cubemap,
                            envMapIntensity: environmentInt
                        } );

                        var snake_body = new THREE.Mesh( geometry, mat );
                        snake_body.material = snake_body_Material;
                        snake_body.scale.set( 1, 1, 1 );
                        snake_body.position.x = 0;
                        snake_body.position.z = 0;
                        snake_body.position.x = 0;
                        snake_body.castShadow = true;
                        snake_body.receiveShadow = true;
                        snake_b = snake_body;
                        scene.add( snake_body );
        } );

        // SNAKE HEAD
        loader.load( "models/snake_head.json", function( geometry, mat ) {

                        //var snake_head_color = textureLoader.load( "textures/snake_head_curvature.jpg" );
                        var snake_head_normal = textureLoader.load( "textures_512/snake_head_normal.jpeg" );
                        var snake_head_roughness = textureLoader.load( "textures_512/snake_head_roughness.jpeg" );

                    snake_head_Material = new THREE.MeshPhysicalMaterial( {
                            roughnessMap: snake_head_roughness,
                            normalMap: snake_head_normal,
                            normalScale: new THREE.Vector2( 2, 2 ),
                            map: null,
                            color: diffuse,
                            metalness: metal,
                            roughness: roughness,
                            envMap: cubemap,
                            envMapIntensity: environmentInt
                        } );

                        var snake_head = new THREE.Mesh( geometry, mat );
                        snake_head.material = snake_head_Material;
                        snake_head.scale.set( 1, 1, 1 );
                        snake_head.position.x = 0;
                        snake_head.position.z = 0;
                        snake_head.position.x = 0;
                        snake_head.castShadow = true;
                        snake_head.receiveShadow = true;
                        snake_h = snake_head;
                        scene.add( snake_head );
        } );

        /* 3D Json files end
        ---------------------------------------------------
        */



        // RENDERER
        webglRenderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
        webglRenderer.setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
        webglRenderer.domElement.style.position = "relative";
        webglRenderer.shadowMapEnabled = true;
        webglRenderer.shadowMapType = THREE.PCFSoftShadowMap; // options are THREE.BasicShadowMap | THREE.PCFShadowMap | THREE.PCFSoftShadowMap

        container.appendChild(webglRenderer.domElement);
        window.addEventListener('resize', onWindowResize, false);
}



/* init end
-----------------------------------------------------------------------------------------------------------------------------
*/







/* Mouse mapping
---------------------------------------------------
*/

function onmousemove(event) {
    mouseX = ( event.clientX - windowHalfX ) / 6;
    mouseY = ( event.clientY - windowHalfY ) / 4;
}

/* 
---------------------------------------------------
*/





/* Window resize
---------------------------------------------------
*/

function onWindowResize() {
    windowHalfX = window.innerWidth / 2;
    windowHalfY = window.innerHeight / 2;

    camera.aspect = window.innerWidth / window.innerHeight;

    var f = (camera.aspect/1.583);
    if(f < 1){
        camera.position.z = 340 /(camera.aspect/1.583);
    }else{
        camera.position.z = 340;
    }

    camera.updateProjectionMatrix();

    webglRenderer.setSize(window.innerWidth, window.innerHeight);
}

/* 
---------------------------------------------------
*/








/* Animate
---------------------------------------------------
*/

function animate() {
    requestAnimationFrame(animate);
    render();
}

/* 
---------------------------------------------------
*/







/* Render
---------------------------------------------------
*/

function render() {

    // Camera
    camera.lookAt(scene.position);
    camera.position.x += ( - mouseX - camera.position.x ) * 0.05;   
    camera.position.y = cameraPos;
    camera.lookAt( scene.position );

    // Light Position
    light.position.x += ( - mouseX - camera.position.x ) * 0.03;
    light.lookAt( scene.position );

    // Render
    webglRenderer.render(scene, camera);
}

/* 
---------------------------------------------------
*/


</script>
</body>
</html>

最佳答案

我不确定你想做什么。你检查过 javascript 调试器吗?您发布的代码似乎无效,因此我认为它会打印很多错误。

什么是“window.onmessage 函数”?也许你的意思是“window.onmessage 等于函数”???

假设 windows.onmessage = function 就是您的意思。你仍然会有

window.onmessage = function ...
...
window.onmessage = function ...
...
window.onmessage = function ...
...

设置 window.onmessage 3 次与设置其他任何内容 3 次没有什么不同。只有最后一次才重要。

a = 1;
a = 2;
a = 3;

表示a = 3

如果您想监视多条消息,您只需分配一个函数,然后根据数据执行不同的操作

 window.onmessage = function(event) {
   switch (event.data.foo) {
     case 'hello':
       doSomethingWhenFooEqualsHello();
       break;
     case 'goodbye':
       doSomethingWhenFooEqualsGoodbay();
       break;
     case 'bingo'
       doSomethingWhenFooEqualsBingo();
       break;
   }
 }

然后当你调用 postMessage 时传递 {foo: 'hello'}{foo: 'goodbye'} 等。当然可以不一定是 foo。您编写数据,并决定如何确定一条消息何时意味着一件事,而另一条消息则意味着另一件事。

据我所知 iframe 需要位于同一个域中(这里可能是错误的,但我不确定如何传递消息或需要哪些 iframe 或 HTTP header 来允许跨域消息传递)

假设它们位于同一个域中,那么我就能够传递消息

index.html

<iframe src="iframe.html"></iframe>
<script>
const iframe = document.querySelector('iframe');
setTimeout(() => {
  postMessage({foo: 123}, window.location.origin);
  iframe.contentWindow.postMessage({foo: 123}, window.location.origin);
}, 500);
</script>

iframe.html

<h1>iframe</h1>
<script>
window.addEventListener('message', (e) => {
    console.log(e);
});
</script>

最后, Three.js 不会自动渲染。如果您想要渲染,您要么需要一个 requestAnimationFrame 渲染循环,就像您在 Three.js 网站上的几乎所有示例中看到的那样,或者,您需要调用自己的渲染函数来重新渲染任何时候发生改变的事件的场景。

关于javascript - Three.js 通过 iframe 传递事件(onMessage),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50886906/

相关文章:

javascript - 删除 DOM 并再次添加回来

javascript - 定义流文字类型时使用外部常量

javascript - 通过javascript检查是否安装了JDK

javascript - Angular - 发出的事件无法到达父组件

javascript - 制作 D3 Pie v4 示例 - 在初始渲染时设置动画

iframe - 如何更改 iframe 的边框,使其与背景融为一体,而不是默认边框?

google-maps - 在某个纬度和经度上显示带有标记的嵌入式谷歌地图 iframe

javascript - iOS 7 移动版中 iframe 中的内容始终滚动到顶部

javascript - 单击时动态加载 iframe

javascript - 在我网站上的 Facebook 点赞按钮上,如何禁用 "post to Facebook"按钮?