ユーザーインターフェイス / コンポーネント / Webビュー

Webビュー

WebViewコンポーネントは、アプリケーション内でWebコンテンツを表示するために使用されます。 このコントロールを使用するには、URLまたはローカルHTMLファイルを指すsrc属性を指定します。

const webViewModule = require("tns-core-modules/ui/web-view");
import { WebView } from "tns-core-modules/ui/web-view";

基本

このサンプルは、NativeScriptアプリケーションでWebViewを使用する基本的な方法を示しています。

XML

<GridLayout rows="75 * 50">
    <GridLayout row="0" rows="*" columns="50 * 50" class="form">
        <Button class="btn btn-primary btn-active icon" row="0" col="0" text="" tap="goBack"/>
        <TextField row="0" col="1" id="urlField" hint="Enter URL" text="{{ tftext }}" returnKeyType="done" returnPress="submit"
            autocorrect="false" verticalAlignment="center" class="input input-border m-t-0" autocapitalizationType="none"/>
        <Button class="btn btn-primary btn-active icon" isEnabled="{{ enabled }}" row="0" col="2" text="" tap="goForward"/>
    </GridLayout>
    <WebView row="1" loaded="onWebViewLoaded" id="myWebView" src="{{ webViewSrc }}" />
    <Label row="2" text="{{ result }}" />
</GridLayout>

webViewSrcを追加してloadFinishedEventイベントを処理する

const Observable = require("tns-core-modules/data/observable").Observable;
const dialogs = require("tns-core-modules/ui/dialogs");
const webViewModule = require("tns-core-modules/ui/web-view");
function onNavigatingTo(args) {
    const page = args.object;
    const vm = new Observable();
    vm.set("webViewSrc", "https://docs.nativescript.org/");
    vm.set("result", "");
    vm.set("tftext", "https://docs.nativescript.org/");
    page.bindingContext = vm;
}
// handling WebView load finish event
function onWebViewLoaded(webargs) {
    const page = webargs.object.page;
    const vm = page.bindingContext;
    const webview = webargs.object;
    vm.set("result", "WebView is still loading...");
    vm.set("enabled", false);

    webview.on(webViewModule.WebView.loadFinishedEvent, (args) => {
        let message = "";
        if (!args.error) {
            message = `WebView finished loading of ${args.url}`;
        } else {
            message = `Error loading ${args.url} : ${args.error}`;
        }

        vm.set("result", message);
        console.log(`WebView message - ${message}`);
    });
}
// going to the previous page if such is available
function goBack(args) {
    const page = args.object.page;
    const vm = page.bindingContext;
    const webview = page.getViewById("myWebView");
    if (webview.canGoBack) {
        webview.goBack();
        vm.set("enabled", true);
    }
}
// going forward if a page is available
function goForward(args) {
    const page = args.object.page;
    const vm = page.bindingContext;
    const webview = page.getViewById("myWebView");
    if (webview.canGoForward) {
        webview.goForward();
    } else {
        vm.set("enabled", false);
    }
}
// changing WebView source
function submit(args) {
    const page = args.object.page;
    const vm = page.bindingContext;
    const textField = args.object;
    const text = textField.text;
    vm.set("enabled", false);
    if (text.substring(0, 4) === "http") {
        vm.set("webViewSrc", text);
        textField.dismissSoftInput();
    } else {
        dialogs.alert("Please, add `http://` or `https://` in front of the URL string")
        .then(() => {
            console.log("Dialog closed!");
        });
    }
}
exports.onNavigatingTo = onNavigatingTo;
exports.onWebViewLoaded = onWebViewLoaded;
exports.submit = submit;
exports.goBack = goBack;
exports.goForward = goForward;
import {Observable} from "tns-core-modules/data/observable";
import * as dialogs from "tns-core-modules/ui/dialogs";
import {WebView, LoadEventData} from "tns-core-modules/ui/web-view";
import { Page } from "tns-core-modules/ui/page";
import { TextField } from "tns-core-modules/ui/text-field";

export function onNavigatingTo(args) {
    const page: Page = <Page> args.object;
    const vm = new Observable();
    vm.set("webViewSrc", "https://docs.nativescript.org/");
    vm.set("result", "");
    vm.set("tftext", "https://docs.nativescript.org/");
    page.bindingContext = vm;
}
// handling WebView load finish event
export function onWebViewLoaded(webargs) {
    const page: Page = <Page> webargs.object.page;
    const vm = page.bindingContext;
    const webview: WebView = <WebView> webargs.object;
    vm.set("result", "WebView is still loading...");
    vm.set("enabled", false);

    webview.on(WebView.loadFinishedEvent, (args: LoadEventData) => {
        let message = "";
        if (!args.error) {
            message = `WebView finished loading of ${args.url}`;
        } else {
            message = `Error loading ${args.url} : ${args.error}`;
        }

        vm.set("result", message);
        console.log(`WebView message - ${message}`);
    });
}
// going to the previous page if such is available
export function goBack(args) {
    const page: Page = <Page> args.object.page;
    const vm = page.bindingContext;
    const webview: WebView = <WebView> page.getViewById("myWebView");
    if (webview.canGoBack) {
        webview.goBack();
        vm.set("enabled", true);
    }
}
// going forward if a page is available
export function goForward(args) {
    const page: Page = <Page> args.object.page;
    const vm = page.bindingContext;
    const webview: WebView = <WebView> page.getViewById("myWebView");
    if (webview.canGoForward) {
        webview.goForward();
    } else {
        vm.set("enabled", false);
    }
}
// changing WebView source
export function submit(args) {
    const page: Page = <Page> args.object.page;
    const vm = page.bindingContext;
    const textField: TextField = <TextField> args.object;
    const text = textField.text;
    vm.set("enabled", false);
    if (text.substring(0, 4) === "http") {
        vm.set("webViewSrc", text);
        textField.dismissSoftInput();
    } else {
        dialogs.alert("Please, add `http://` or `https://` in front of the URL string")
        .then(() => {
            console.log("Dialog closed!");
        });
    }
}

CSS

icon{
    font-family: 'icomoon';
    vertical-align: center;
    margin: 6;
}

/*WebView {
    border-color: lightgray;
    border-width: 0.5;
}*/

デモソース


イベント

この例は、WebViewコンポーネントとそのreloadメソッドでサポートされているイベントの使用方法を示しています。

<GridLayout rows="50 50 50 *" columns="* *">
    <Button row="0" col="0" text="Load first url" tap="loadFirst" />
    <Button row="0" col="1" text="Load second url" tap="loadSecond" />
    <Button row="1" col="0" colSpan="2" text="Reload page" tap="onReload" />
    <Label row="2" col="0" colSpan="2" text="{{ 'Url: ' + webViewSrc }}" textWrap="true" class="p-12" />

    <WebView id="webview" row="3" col="0" colSpan="2" loadStarted="onLoadStarted" loadFinished="onLoadFinished" src="{{ webViewSrc }}" />
    <GridLayout class="indicator" visibility="{{ isItemVisible ? 'visible' : 'collapsed' }}" row="0" col="0" rowSpan="4" colSpan="2">
            <ActivityIndicator width="100" height="100" busy="true"/>
    </GridLayout>
</GridLayout>
function onNavigatingTo(args) {
    const page = args.object;
    const vm = new Observable();
    vm.set("webViewSrc", secondUrl);
    vm.set("isItemVisible", true);
    page.bindingContext = vm;
}

function onLoadStarted(args) {
    const page = args.object;
    const vm = page.bindingContext;
    vm.set("isItemVisible", true);
    let message;
    if (!args.error) {
        message = `WebView started loading of ${args.url}`;
    } else {
        message = `Error loading  ${args.url} : ${args.error}`;
    }
    console.log(message);

}
function onLoadFinished(args) {
    const page = args.object;
    const vm = page.bindingContext;
    let message;
    if (!args.error) {
        message = `WebView finished loading of  ${args.url}`;
    } else {
        message = `Error loading ${args.url} : ${args.error}`;
    }
    console.log(message);
}

function loadFirst(args) {
    const page = args.object.page;
    const vm = page.bindingContext;
    vm.set("webViewSrc", firstUrl);
}

function loadSecond(args) {
    const page = args.object.page;
    const vm = page.bindingContext;
    vm.set("webViewSrc", secondUrl);
}

function onReload(args) {
    const page = args.object.page;
    webview = page.getViewById("webview");
    webview.reload();
}

exports.onNavigatingTo = onNavigatingTo;
exports.onLoadStarted = onLoadStarted;
exports.onLoadFinished = onLoadFinished;
exports.loadFirst = loadFirst;
exports.loadSecond = loadSecond;
exports.onReload = onReload;
export function onNavigatingTo(args) {
    const page: Page = <Page>args.object;
    const vm = new Observable();
    vm.set("webViewSrc", secondUrl);
    vm.set("isItemVisible", true);
    page.bindingContext = vm;
}

export function onLoadStarted(args) {
    const page: Page = <Page>args.object;
    const vm = page.bindingContext;
    vm.set("isItemVisible", true);
    let message;
    if (!args.error) {
        message = `WebView started loading of ${args.url}`;
    } else {
        message = `Error loading  ${args.url} : ${args.error}`;
    }
    console.log(message);

}
export function onLoadFinished(args) {
    const page = (<Page>args.object);
    const vm = page.bindingContext;
    let message;
    if (!args.error) {
        message = `WebView finished loading of  ${args.url}`;
    } else {
        message = `Error loading ${args.url} : ${args.error}`;
    }
    console.log(message);
}

export function loadFirst(args) {
    const page: Page = <Page>args.object.page;
    const vm = page.bindingContext;
    vm.set("webViewSrc", firstUrl);
}

export function loadSecond(args) {
    const page: Page = <Page>args.object.page;
    const vm = page.bindingContext;
    vm.set("webViewSrc", secondUrl);
}

export function onReload(args) {
    const page: Page = <Page>args.object.page;
    const webview: WebView = <WebView>page.getViewById("webview");
    webview.reload();
}

サンプルコードでは、イベントloadStartedloadFinishedを設定しています。 WebViewコンポーネントのソースを変更すると(URLを変更するか、ローカルHTMLファイルをロードすると)、両方のイベントが発生します。 このloadStartedイベントは、WebViewソースがロードを開始したときに実行され、 loadFinishedはソースのロードが完了したときに発生します。 イベントは、ロードしようとしている eventNamenavigationTypeurl に関する情報を返します。 ソースロードのいくつかのステップでエラーが発生した場合、loadStartedイベントまたは loadFinishedイベントでerrorプロパティを使用して対応するエラーを受け取ります。

提供されているサンプルでは、​​WebViewのreloadメソッドを介して、現在ロードされているソースを再ロードする方法も示されています。

デモソース


ジェスチャー

コードサンプルは、iOSとAndroidの両方のプラットフォームでWebViewのジェスチャーを使用する方法を示しています。

<GridLayout rows="50 50 *">
    <Label row="0" text="{{ touchResult }}" textWrap="true" />
    <Label row="1" text="{{ panResult }}" textWrap="true" />
    <WebView row="2" loaded="onWebViewLoaded"  touch="webViewTouch" pan="webViewPan" src="{{ webViewSrc }}" />
</GridLayout>
function onNavigatingTo(args) {
    const page = args.object;
    const vm = new Observable();
    vm.set("webViewSrc", "<!DOCTYPE html><html><body><h1>My First Heading</h1><p>My first paragraph.</p></body></html>");
    vm.set("touchResult", "Touch: x: _ y: _");
    vm.set("panResult", "Pan: deltaX: _ deltaY: _");
    page.bindingContext = vm;
}
// disabling the WebView's zoom control(required only for Android)
function onWebViewLoaded(webargs) {
    const webview = webargs.object;
    if (platformModule.isAndroid) {
        webview.android.getSettings().setDisplayZoomControls(false);
    }
}
// setting up Touch gesture callback method
function webViewTouch(args) {
    const page = args.object.page;
    const vm = page.bindingContext;
    vm.set("touchResult", `Touch: x: ${args.getX().toFixed(3)} y: ${args.getY().toFixed(3)}`);
    console.log(`Touch: x: ${args.getX().toFixed(3)} y: ${args.getY().toFixed(3)}`);
}
// setting up Pan gesture callback method
function webViewPan(args) {
    const page = args.object.page;
    const vm = page.bindingContext;
    vm.set("panResult", `Pan: deltaX: ${args.deltaX.toFixed(3)} deltaY: ${args.deltaY.toFixed(3)}`);
    console.log(`Pan: deltaX: ${args.deltaX.toFixed(3)} deltaY: ${args.deltaY.toFixed(3)}`);
}

exports.onNavigatingTo = onNavigatingTo;
exports.onWebViewLoaded = onWebViewLoaded;
exports.webViewTouch = webViewTouch;
exports.webViewPan = webViewPan;
export function onNavigatingTo(args) {
    const page: Page = <Page>args.object;
    const vm = new Observable();
    vm.set("webViewSrc", "<!DOCTYPE html><html><body><h1>My First Heading</h1><p>My first paragraph.</p></body></html>");
    vm.set("touchResult", "Touch: x: _ y: _");
    vm.set("panResult", "Pan: deltaX: _ deltaY: _");
    page.bindingContext = vm;
}
// disabling the WebView's zoom control(required only for Android)
export function onWebViewLoaded(webargs) {
    const webview: WebView = <WebView>webargs.object;
    if (isAndroid) {
        webview.android.getSettings().setDisplayZoomControls(false);
    }
}
// setting up Touch gesture callback method
export function webViewTouch(args) {
    const page: Page = <Page>args.object.page;
    const vm = page.bindingContext;
    vm.set("touchResult", `Touch: x: ${args.getX().toFixed(3)} y: ${args.getY().toFixed(3)}`);
    console.log(`Touch: x: ${args.getX().toFixed(3)} y: ${args.getY().toFixed(3)}`);
}
// setting up Pan gesture callback method
export function webViewPan(args) {
    const page: Page = <Page>args.object.page;
    const vm = page.bindingContext;
    vm.set("panResult", `Pan: deltaX: ${args.deltaX.toFixed(3)} deltaY: ${args.deltaY.toFixed(3)}`);
    console.log(`Pan: deltaX: ${args.deltaX.toFixed(3)} deltaY: ${args.deltaY.toFixed(3)}`);
}
注釈: AndroidのWebViewコンポーネントでジェスチャーを使用できるようにするには、まずズームコントロールを無効にする必要があります。 これを行うには、androidプロパティにアクセスしその助けを借りて、 setDisplayZoomControlsコントロールをfalseに設定します。

デモソース


ソースの読み込み

この例では、ローカルファイルを使用するか、HTMLコードをsrcプロパティに直接提供することで、 WebViewコンポーネントにコンテンツをロードする方法を示します。

XML

<GridLayout rows="100 50 * 50" columns="*">
	<WebView row="0" col="0" loaded="onFirstWebViewLoaded" src="{{ firstWebViewSRC }}"/>
	<Label row="1" text="{{ resultFirstWebView }}" textWrap="true" />
	<WebView row="2" col="0" loaded="onSecondWebViewLoaded" src="{{ secondWebViewSRC }}"/>
	<Label row="3" text="{{ resultSecondWebView }}" textWrap="true" />
</GridLayout>
ローカルファイルからWebViewのsrcを追加する
const Observable = require("tns-core-modules/data/observable").Observable;
const webViewModule = require("tns-core-modules/ui/web-view");
function onNavigatingTo(args) {
    const page = args.object;
    const vm = new Observable();
    // loading the WebView source while providing a HTML code
    vm.set("firstWebViewSRC", "<!DOCTYPE html><html><head><title>MyTitle</title><meta charset='utf-8' /></head><body><span style='color:#0099CC; text-align: center;'>First WebView</span></body></html>");
    vm.set("resultFirstWebView", "");
    // loading the WebView source from a local file
    vm.set("secondWebViewSRC", "~/ns-ui-widgets-category/web-view/source-load/test.html");
    vm.set("resultSecondWebView", "");
    page.bindingContext = vm;
}

function onFirstWebViewLoaded(webargs) {
    const page = webargs.object.page;
    const vm = page.bindingContext;
    const webview = webargs.object;
    vm.set("resultFirstWebView", "First WebView is still loading...");
    // handling WebView load finish event
    webview.on(webViewModule.WebView.loadFinishedEvent, (args) => {
        let message = "";
        if (!args.error) {
            message = `First WebView finished loading of ${args.url}`;
        } else {
            message = `Error loading first WebView ${args.url} : ${args.error}`;
        }

        vm.set("resultFirstWebView", message);
        console.log("First WebView message - ", message);
    });
}

function onSecondWebViewLoaded(webargs) {
    const page = webargs.object.page;
    const vm = page.bindingContext;
    const webview = webargs.object;
    vm.set("resultSecondWebView", "Second WebView is still loading...");

    webview.on(webViewModule.WebView.loadFinishedEvent, (args) => {
        let message = "";
        if (!args.error) {
            message = `Second WebView finished loading of ${args.url}`;
        } else {
            message = `Error loading second WebView  ${args.url} : ${args.error}`;
        }

        vm.set("resultSecondWebView", message);
        console.log("Second WebView message - ", message);
    });
}

exports.onNavigatingTo = onNavigatingTo;
exports.onFirstWebViewLoaded = onFirstWebViewLoaded;
exports.onSecondWebViewLoaded = onSecondWebViewLoaded;
import {Observable} from "tns-core-modules/data/observable";
import {WebView, LoadEventData} from "tns-core-modules/ui/web-view";
import {Page} from "tns-core-modules/ui/page";
export function onNavigatingTo(args) {
    const page: Page = <Page> args.object;
    const vm = new Observable();
    // loading the WebView source while providing a HTML code
    vm.set("firstWebViewSRC", "<!DOCTYPE html><html><head><title>MyTitle</title><meta charset='utf-8' /></head><body><span style='color:#0099CC; text-align: center;'>First WebView</span></body></html>");
    vm.set("resultFirstWebView", "");
    // loading the WebView source from a local file
    vm.set("secondWebViewSRC", "~/ns-ui-widgets-category/web-view/source-load/test.html");
    vm.set("resultSecondWebView", "");
    page.bindingContext = vm;
}

export function onFirstWebViewLoaded(webargs) {
    const page: Page = <Page> webargs.object.page;
    const vm = page.bindingContext;
    const webview: WebView = <WebView> webargs.object;
    vm.set("resultFirstWebView", "First WebView is still loading...");
    // handling WebView load finish event
    webview.on(WebView.loadFinishedEvent, (args: LoadEventData) => {
        let message = "";
        if (!args.error) {
            message = `First WebView finished loading of ${args.url}`;
        } else {
            message = `Error loading first WebView ${args.url} : ${args.error}`;
        }

        vm.set("resultFirstWebView", message);
        console.log("First WebView message - ", message);
    });
}

export function onSecondWebViewLoaded(webargs) {
    const page: Page = <Page> webargs.object.page;
    const vm = page.bindingContext;
    const webview: WebView = <WebView>webargs.object;
    vm.set("resultSecondWebView", "Second WebView is still loading...");

    webview.on(WebView.loadFinishedEvent, (args: LoadEventData) => {
        let message = "";
        if (!args.error) {
            message = `Second WebView finished loading of ${args.url}`;
        } else {
            message = `Error loading second WebView  ${args.url} : ${args.error}`;
        }

        vm.set("resultSecondWebView", message);
        console.log("Second WebView message - ", message);
    });
}

デモソース


APIリファレンス WebViewクラス

ネイティブコンポーネント

ANDROID IOS
android.webkit.WebView WKWebView
入門

コアコンセプト

ユーザーインターフェース

ツール

ハードウェアアクセス

プラグインの開発

リリース

アプリテンプレート

パフォーマンスの最適化

フレームワークモジュール

ガイド

サポートを受ける

トラブルシューティング

Siedkick