liên kết mở phonegap trong trình duyệt


114
<a target="_blank" data-rel="external" href="http://www.kidzout.com">www.kidzout.com</a>

Xin chào các chuyên gia, tôi đang sử dụng phonegap 2.9.0 và tôi đang sử dụng mã trên để mở liên kết trong trình duyệt nhưng nó lại mở trong cùng một ứng dụng ...... làm thế nào để mở trình duyệt safari?

nó mở trang web trong cùng một ứng dụng và sau đó tôi không thể quay lại ứng dụng đó, vì vậy tôi cần phải xóa ứng dụng và cài đặt lại .....


Nếu bạn muốn mở _blanktrình duyệt bên ngoài và _selfWebView, hãy kiểm tra giải pháp năm 2015 của tôi cho Cordova 5.1.1: stackoverflow.com/a/32227524/82609
Sebastien Lorber

Xem thêm các câu trả lời trong một câu hỏi tương tự: stackoverflow.com/a/26176013/1480587stackoverflow.com/a/46619378/1480587
Peter T.

Câu trả lời:


225

Như được đề xuất trong một câu hỏi tương tự , hãy sử dụng JavaScript để gọi window.openvới targetđối số được đặt thành _system, theo tài liệu InAppBrowser :

<a href="#" onclick="window.open('http://www.kidzout.com', '_system'); return false;">www.kidzout.com</a>

Điều này sẽ hoạt động, mặc dù giải pháp tốt hơn và linh hoạt hơn sẽ là chặn tất cả các clicksự kiện của liên kết và gọi window.openvới các đối số được đọc từ các thuộc tính của liên kết.

Hãy nhớ rằng bạn phải cài đặt plugin InAppBrowser để nó hoạt động:

cordova plugin add cordova-plugin-inappbrowser

3
vâng, tôi cũng đã sử dụng cùng target = "_ blank" trong cordova 1.7.0 nhưng bây giờ tôi đang làm việc với 2.9.0 và điều đó khiến tôi khó chịu, sujjestion của bạn cũng không hoạt động ...... :(
ahsan ali

6
vâng tôi đã cố gắng điều đó quá và theo các liên kết quá mà bạn chia sẻ, nhờ sự giúp đỡ của bạn nhưng vấn đề vẫn còn đó, trang web vẫn được mở trong ứng dụng ...... :(
Ahsan ali

này ahsan, bạn có vui lòng giải thích thêm về vấn đề của bạn không? Tôi nghĩ rằng tôi có thể đang gặp vấn đề tương tự.
whossname, 27/09/13

3
Hãy nhớ rằng bạn phải cài đặt plugin InAppBrowser cho điều này để làm việc, hướng dẫn tại đây: cordova.apache.org/docs/en/3.0.0/...
jackocnr

7
Tôi gặp vấn đề tương tự .. giải pháp không hoạt động :( nó mở ra chỉ như một liên kết thông thường (trên Android)
Daniel

29

Như đã trả lời trong các bài viết khác, bạn có hai tùy chọn khác nhau cho các nền tảng khác nhau. Những gì tôi làm là:

document.addEventListener('deviceready', onDeviceReady, false);

function onDeviceReady() {

    // Mock device.platform property if not available
    if (!window.device) {
        window.device = { platform: 'Browser' };
    }

    handleExternalURLs();
}

function handleExternalURLs() {
    // Handle click events for all external URLs
    if (device.platform.toUpperCase() === 'ANDROID') {
        $(document).on('click', 'a[href^="http"]', function (e) {
            var url = $(this).attr('href');
            navigator.app.loadUrl(url, { openExternal: true });
            e.preventDefault();
        });
    }
    else if (device.platform.toUpperCase() === 'IOS') {
        $(document).on('click', 'a[href^="http"]', function (e) {
            var url = $(this).attr('href');
            window.open(url, '_system');
            e.preventDefault();
        });
    }
    else {
        // Leave standard behaviour
    }
}

Vì vậy, như bạn có thể thấy, tôi đang kiểm tra nền tảng thiết bị và tùy thuộc vào đó tôi đang sử dụng một phương pháp khác. Trong trường hợp của một trình duyệt tiêu chuẩn, tôi để lại hành vi tiêu chuẩn. Kể từ bây giờ, giải pháp sẽ hoạt động tốt trên Android, iOS và trong trình duyệt, trong khi trang HTML sẽ không bị thay đổi, vì vậy nó có thể có các URL được biểu diễn dưới dạng liên kết chuẩn

<a href="http://stackoverflow.com">

Giải pháp yêu cầu các plugin InAppBrowser và Thiết bị


Câu trả lời xuất sắc. Đề phòng trường hợp nó không dành cho người khác, hãy đảm bảo rằng www / cordova_plugins.js của bạn có cả thiết bị và cấu hình inappbrowser đi kèm. Khi tôi cài đặt plugin, nó sẽ thêm cấu hình js & plugins vào thư mục staging chứ không phải thư mục www hoạt động chính của tôi. Khi tôi đã sắp xếp cấu hình và vị trí, điều này hoạt động hoàn hảo.
Michael Bordash

1
Đây là câu trả lời tốt nhất! Hãy nhớ rằng bạn chưa cài đặt plugin InAppBrowser qua:$ meteor add cordova:org.apache.cordova.inappbrowser@0.5.4
tixastronauta.

Nếu có ai muốn đóng góp cho đoạn mã, tôi đã tải nó lên ý chính. gist.github.com/redolent/e79722b32a48a536b5ba
hương thơm

28
<a onclick="navigator.app.loadUrl('https://google.com/', { openExternal:true });">Link</a>

Hoạt động cho tôi với Android & PG 3.0


Có vẻ như vẫn không thành công đối với tôi trên cả Android 2.3.7 và 4.2.2.
user569825,

2
Hoạt động cho tôi trên Android 4.4.2 với Cordova 3.3.0. Nhưng không hoạt động trên iOS 6.1.
mytharcher

Làm việc cho tôi cordova 3.3.0, cảm ơn và bạn lấy thông tin này ở đâu? Không thể tìm thấy trong tài liệu.
Teoman shipahi

Điều này phù hợp với tôi với cordova 3.4.1 và android 4.2. Tôi không cần một plugin. Tôi sẽ báo cáo lại sau khi thử nghiệm trên iOS7.
pgsandstrom

Đây là giải pháp duy nhất Mà làm việc cho tôi trên android, nhờ
Niraj Chauhan

21

Có 2 cách khác nhau để mở URL trong android và iphone.

ĐỐI VỚI IOS sử dụng mã sau.

window.open("http://google.com", '_system');

và cho hệ điều hành android sử dụng mã sau.

navigator.app.loadUrl("http://google.com", {openExternal : true});

Cordova cũng có thể sử dụng window.open("http://google.com", '_system'). Bạn không nên sử dụng navigator.app.loadUrl, vì nó sẽ không hoạt động với market://URL: trong trường hợp đó, nó sẽ chỉ đóng ứng dụng của bạn và mở trong cùng một cửa sổ .. không phải lúc nào cũng thích hợp.
Agamemnus

1
Agamemnus, window.open không hoạt động trên Android trong ứng dụng phonegap 3.6 của tôi. Tôi cần sử dụng giải pháp trong câu trả lời này để làm cho nó hoạt động.
Moulde

10

Cuối cùng, bài đăng này giúp tôi trên iOS: http://www.exchesiawebworld.com/phonegap-open-a-link-in-safari-or-external-browser/ .

Mở tệp "CDVwebviewDelegate.m" và tìm kiếm "shouldStartLoadWithRequest", sau đó thêm mã này vào đầu hàm:

if([[NSString stringWithFormat:@"%@",request.URL] rangeOfString:@"file"].location== NSNotFound) {
    [[UIApplication sharedApplication] openURL:[request URL]];
    return NO;
}

Trong khi sử dụng navigator.app.loadUrl("http://google.com", {openExternal : true}); cho Android là OK.

Qua Cordova 3.3.0.


Đây là thứ duy nhất làm việc cho tôi trong phiên bản 3.0.0. Cảm ơn bạn!!
Rocklan

Trong phiên bản 3.0, bạn cần bao gồm plugin InAppBrowser. Tuy nhiên điều đó có vẻ kỳ lạ.
Sean Bannister

Tôi sẽ thay đổi nó một lớp ở trên trong MainViewController.m: - (BOOL) webView: (UIWebView *) theWebView shouldStartLoadWithRequest: (NSURLRequest *) request navigationType: (UIWebViewNavigationType) navigationType {NSURL * url = [request URL]; if ([[url Scheme] isEqualToString: @ "file"] || [[url Scheme] isEqualToString: @ "gap"]) {return [super webView: theWebView shouldStartLoadWithRequest: request navigationType: navigationType]; } else {[[UIApplication sharedApplication] openURL: url]; trả lại KHÔNG; }}
Gamadril

10

Không có câu trả lời nào trong số này đủ rõ ràng để mở các liên kết bên ngoài trong mỗi nền tảng. Theo tài liệu inAppBrowser :

Tải về

cordova plugin add cordova-plugin-inappbrowser

Ghi đè window.open (tùy chọn, nhưng được khuyến nghị để đơn giản)

window.open = cordova.InAppBrowser.open;

Nếu bạn không ghi đè window.open, bạn sẽ sử dụng window.openhàm gốc và không thể mong đợi nhận được cùng một kết quả trên nhiều nền tảng.

Sử dụng nó để mở các liên kết trong trình duyệt mặc định

window.open(your_href_value, '_system');

Lưu ý rằng mục tiêu cho inAppBrowser (tên plugin gợi ý rằng nó sẽ được sử dụng) '_blank'thay vì mục tiêu '_system'.


Nếu không có các bước trên, tôi không thể nhận liên kết để mở trong ứng dụng trình duyệt mặc định trên nhiều nền tảng.

Tín dụng thêm

Đây là một ví dụ về xử lý nhấp chuột (trực tiếp) cho các liên kết:

document.addEventListener('click', function (e) {
    if (e.target.tagName === 'A' &&
        e.target.href.match(/^https?:\/\//)) {
        e.preventDefault();
        window.open(e.target.href, '_system');
    }
});

Chính xác thì bạn ghi đè window.open ở đâu? Trong trang web hoặc ứng dụng cordova
Ellisan

Tốt phía trên cùng của tập tin JavaScript của bạn mà bạn nạp vào trang index.html của bạn (trang web của bạn, nếu điều đó giúp)
bozdoz

7

Nếu bạn tình cờ có jQuery xung quanh, bạn có thể chặn cú nhấp chuột vào liên kết như sau:

$(document).on('click', 'a', function (event) {
    event.preventDefault();
    window.open($(this).attr('href'), '_system');
    return false;
});

Bằng cách này, bạn không phải sửa đổi các liên kết trong html, điều này có thể tiết kiệm rất nhiều thời gian. Tôi đã thiết lập điều này bằng cách sử dụng một đại biểu, đó là lý do tại sao bạn thấy nó được gắn với đối tượng tài liệu, với thẻ 'a' làm đối số thứ hai. Bằng cách này, tất cả các thẻ 'a' sẽ được xử lý, bất kể khi nào chúng được thêm vào.

Tất nhiên, bạn vẫn phải cài đặt plugin InAppBrowser:

cordova plugin add org.apache.cordova.inappbrowser

đây là một ý tưởng tốt đẹp mà tôi sẽ sử dụng nhưng bạn cũng nên chăm sóc của các cuộc gọi window.open trực tiếp (không phải tất cả mọi thứ đi qua một liên kết)
Sebastien Lorber

3
window.open('http://www.kidzout.com', '_system');

Sẽ hoạt động nhưng chỉ khi bạn đã cài đặt plugin inappbrowser. Để cài đặt, sử dụng terminal, hãy duyệt đến thư mục www trong dự án của bạn và nhập:

phonegap plugin add org.apache.cordova.inappbrowser

hoặc là

cordova plugin add org.apache.cordova.inappbrowser

Sau đó, liên kết của bạn sẽ mở trong trình duyệt.


Lệnh phonegap local <command>đã được DEPRECATED. Lệnh đã được ủy quyền cho phonegap <command>. Lệnh phonegap local <command>sẽ sớm bị gỡ bỏ.
Ajay Suwalka

Tôi không biết trong quá khứ, nhưng ngày nay cách chính xác để cài đặt plugin này cordova plugin add cordova-plugin-inappbrowser.
Plinio FM

2

Với Cordova 5.0 trở lên, plugin InAppBrowser được đổi tên trong sổ đăng ký plugin Cordova, vì vậy bạn nên cài đặt nó bằng

cordova plugin add cordova-plugin-inappbrowser --save

Sau đó sử dụng

<a href="#" onclick="window.open('http://www.kidzout.com', '_system');">www.kidzout.com</a>


1

Tôi đang sử dụng PhoneGap Build (v3.4.0), tập trung vào iOS và tôi cần có mục nhập này trong config.xml của mình để PhoneGap nhận dạng plugin InAppBrowser.

<gap:plugin name="org.apache.cordova.inappbrowser" />

Sau đó, sử dụng window.open (url, target) sẽ hoạt động như mong đợi, như được nêu ở đây .


1
Tôi m also using PhoneGap Build (v3.5.x) and added the plugin via the config.xml. But what i get is an InAppBrowser without controls an cannot call the safari browser. Ichỉ sử dụng window.open (). Có lời khuyên nào không?
Reinos

Nếu nó được thiết lập chính xác, window.open sẽ hoạt động. Trong tình huống của tôi, window.open đang mở một url trình duyệt khác và nó hoạt động ổn. Đảm bảo rằng URL ổn.
contactmatt

Tôi vừa thử điều này với Phonegap Build & It is erroring with: "plugin unsupported: org.apache.cordova.inappbrowser"
David Ball

1

Tôi cũng gặp phải vấn đề liên kết không mở trên trình duyệt, đây là cách khắc phục của tôi bằng các bước:

1: Cài đặt plugin cordova này.

cordova plugin add cordova-plugin-inappbrowser

2: Thêm liên kết mở trong html như sau.

<a href="#" onclick="window.open('https://www.google.com/', '_system', 'location=yes');" >Google</a>

3: Đây là bước importaint nhiều nhất do tôi gặp phải rất nhiều vấn đề: tải cordova.jstệp xuống và dán vào wwwthư mục. Sau đó, hãy tham khảo điều này trong index.htmltệp.

<script src="cordova.js"></script>

Giải pháp này sẽ hoạt động cho cả môi trường Android và iPhone.


-2

Như thế này :

<a href="#" onclick="window.open('https://www.nbatou.com', '_system'); return false;">https://www.nbatou.com</a>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.