الفرق بين المراجعتين لصفحة: «Cordova/cordova plugin inappbrowser»
لا ملخص تعديل |
تحديث |
||
سطر 143: | سطر 143: | ||
==<code>InAppBrowser.addEventListener</code>== | ==<code>InAppBrowser.addEventListener</code>== | ||
يضيف هذا التابع مُنصتًا (listener) لحدثٍ من <code>InAppBrowser</code>. (متاح فقط عند ضبط الخيار <code>target</code> إلى القيمة <code>'_blank'</code>). | يضيف هذا التابع مُنصتًا (listener) لحدثٍ من <code>InAppBrowser</code>. (متاح فقط عند ضبط الخيار <code>target</code> إلى القيمة <code>'_blank'</code>). | ||
<syntaxhighlight lang="javascript">ref.addEventListener(eventname, callback);</syntaxhighlight> | <syntaxhighlight lang="javascript">ref.addEventListener(eventname, callback);</syntaxhighlight>المعاملات المُرَّرة إلى هذا التابع هي: | ||
* <code>ref</code> : يشير إلى نافذة <code>InAppBrowser</code> (InAppBrowser). | |||
* <code>eventname</code>: سلسلة نصية تمثِّل الحدث المُراد ربط منصت به. | |||
** <code>loadstart</code>: يُطلق هذا الحدث عندما يبدأ <code>InAppBrowser</code> في تحميل عنوان URL. | *<code>eventname</code>: سلسلة نصية تمثِّل الحدث المُراد ربط منصت به. | ||
** <code>loadstop</code>: يُطلق هذا الحدث عند انتهاء <code>InAppBrowser</code> من تحميل عنوان URL. | **<code>loadstart</code>: يُطلق هذا الحدث عندما يبدأ <code>InAppBrowser</code> في تحميل عنوان URL. | ||
** <code>loaderror</code>: يُطلق هذا الحدث عندما يواجه <code>InAppBrowser</code> خطأً أثناء تحميل عنوان URL. | **<code>loadstop</code>: يُطلق هذا الحدث عند انتهاء <code>InAppBrowser</code> من تحميل عنوان URL. | ||
** <code>exit</code>: يُطلق هذا الحدث عند إغلاق نافذة <code>InAppBrowser</code>. | **<code>loaderror</code>: يُطلق هذا الحدث عندما يواجه <code>InAppBrowser</code> خطأً أثناء تحميل عنوان URL. | ||
* <code>callback</code>: دالة رد النداء التي ستنفذ عند إطلاق الحدث. يُمرّر إليها الكائن <code>InAppBrowserEvent</code> كمعاملٍ. | **<code>exit</code>: يُطلق هذا الحدث عند إغلاق نافذة <code>InAppBrowser</code>. | ||
** <code>beforeload</code>: يُطلق هذا الحدث عندما يقرر <code>InAppBrowser</code> إن كان سيُحمِّل عنوان URL أو لا (فقط عند تعيين الخيار <code>beforeload</code>) | |||
** <code>message</code>: يُطلق هذا الحدث عندما يتلقى <code>InAppBrowser</code> رسالة من الصفحة التي تم تحميلها داخل [[Cordova/webviews|عارض]] <code>InAppBrowser</code> . | |||
*<code>callback</code>: دالة رد النداء التي ستنفذ عند إطلاق الحدث. يُمرّر إليها الكائن <code>InAppBrowserEvent</code> كمعاملٍ. | |||
إليك المثال التالي:<syntaxhighlight lang="javascript">var inAppBrowserRef; | إليك المثال التالي:<syntaxhighlight lang="javascript">var inAppBrowserRef; | ||
function showHelp(url) { | function showHelp(url) { | ||
var target = "_blank"; | var target = "_blank"; | ||
var options = "location=yes,hidden=yes"; | |||
var options = "location=yes,hidden=yes,beforeload=yes"; | |||
inAppBrowserRef = cordova.InAppBrowser.open(url, target, options); | inAppBrowserRef = cordova.InAppBrowser.open(url, target, options); | ||
inAppBrowserRef.addEventListener('loadstart', loadStartCallBack); | inAppBrowserRef.addEventListener('loadstart', loadStartCallBack); | ||
inAppBrowserRef.addEventListener('loadstop', loadStopCallBack); | inAppBrowserRef.addEventListener('loadstop', loadStopCallBack); | ||
inAppBrowserRef.addEventListener('loaderror', loadErrorCallBack); | inAppBrowserRef.addEventListener('loaderror', loadErrorCallBack); | ||
inAppBrowserRef.addEventListener('beforeload', beforeloadCallBack); | |||
inAppBrowserRef.addEventListener('message', messageCallBack); | |||
} | } | ||
function loadStartCallBack() { | function loadStartCallBack() { | ||
$('#status-message').text("loading please wait ..."); | $('#status-message').text("loading please wait ..."); | ||
} | } | ||
function loadStopCallBack() { | function loadStopCallBack() { | ||
if (inAppBrowserRef != undefined) { | if (inAppBrowserRef != undefined) { | ||
inAppBrowserRef.insertCSS({ code: "body{font-size: 25px;" }); | inAppBrowserRef.insertCSS({ code: "body{font-size: 25px;" }); | ||
inAppBrowserRef.executeScript({ code: "\ | |||
var message = 'this is the message';\ | |||
var messageObj = {my_message: message};\ | |||
var stringifiedMessageObj = JSON.stringify(messageObj);\ | |||
webkit.messageHandlers.cordova_iab.postMessage(stringifiedMessageObj);" | |||
}); | |||
$('#status-message').text(""); | $('#status-message').text(""); | ||
inAppBrowserRef.show(); | inAppBrowserRef.show(); | ||
} | } | ||
} | } | ||
function loadErrorCallBack(params) { | function loadErrorCallBack(params) { | ||
$('#status-message').text(""); | $('#status-message').text(""); | ||
var scriptErrorMesssage = | var scriptErrorMesssage = | ||
"alert('Sorry we cannot open that page. Message from the server is : " | "alert('Sorry we cannot open that page. Message from the server is : " | ||
+ params.message + "');" | + params.message + "');" | ||
inAppBrowserRef.executeScript({ code: scriptErrorMesssage }, executeScriptCallBack); | inAppBrowserRef.executeScript({ code: scriptErrorMesssage }, executeScriptCallBack); | ||
inAppBrowserRef.close(); | inAppBrowserRef.close(); | ||
inAppBrowserRef = undefined; | inAppBrowserRef = undefined; | ||
} | } | ||
function executeScriptCallBack(params) { | function executeScriptCallBack(params) { | ||
if (params[0] == null) { | if (params[0] == null) { | ||
$('#status-message').text( | $('#status-message').text( | ||
"Sorry we couldn't open that page. Message from the server is : '" | "Sorry we couldn't open that page. Message from the server is : '" | ||
+ params.message + "'"); | + params.message + "'"); | ||
} | } | ||
} | |||
} | |||
function beforeloadCallBack(params, callback) { | |||
if (params.url.startsWith("http://www.example.com/")) { | |||
// Load this URL in the inAppBrowser. | |||
callback(params.url); | |||
} else { | |||
// The callback is not invoked, so the page will not be loaded. | |||
$('#status-message').text("This browser only opens pages on http://www.example.com/"); | |||
} | |||
} | |||
function messageCallBack(params){ | |||
$('#status-message').text("message received: "+params.data.my_message); | |||
}</syntaxhighlight> | |||
=== خاصيات الكائن <code>InAppBrowserEvent</code> === | === خاصيات الكائن <code>InAppBrowserEvent</code> === | ||
الخاصيات المتاحة لاستعمالها مع الكائن <code>InAppBrowserEvent</code> هي: | الخاصيات المتاحة لاستعمالها مع الكائن <code>InAppBrowserEvent</code> هي: | ||
سطر 193: | سطر 252: | ||
* <code>code</code>: عدد يمثِّل رمز الخطأ. لا تكون هذه الخاصية مُتاحةً إلا في حال إطلاق الحدث <code>loaderror</code>. | * <code>code</code>: عدد يمثِّل رمز الخطأ. لا تكون هذه الخاصية مُتاحةً إلا في حال إطلاق الحدث <code>loaderror</code>. | ||
* <code>message</code>: سلسلة نصية تمثِّل رسالة الخطأ، لا تكون هذه الخاصية مُتاحةً إلا في حال إطلاق الحدث <code>loaderror</code>. | * <code>message</code>: سلسلة نصية تمثِّل رسالة الخطأ، لا تكون هذه الخاصية مُتاحةً إلا في حال إطلاق الحدث <code>loaderror</code>. | ||
* <code>data</code>: محتويات الرسالة، لا تعمل إلا في حال تعيين <code>message</code>. وهي كائن JSON (سلسلة نصية). | |||
المنصات المدعومة هي: | المنصات المدعومة هي: | ||
*أندرويد | *أندرويد | ||
سطر 201: | سطر 261: | ||
=== ملاحظات خاصة بالمتصفحات (Browsers) === | === ملاحظات خاصة بالمتصفحات (Browsers) === | ||
في هذه المنصات، لا | في هذه المنصات، لا تُطلق الأحداث <code>loadstart</code> و <code>loaderror</code> و <code>message</code>. | ||
إليك | === ملاحظات خاصة بويندوز === | ||
في هذه المنصة، لا يُطلق الحدث <code>message</code>. | |||
إليك مثالا سريعا عن التابع <code>addEventListener</code>:<syntaxhighlight lang="javascript">var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes'); | |||
ref.addEventListener('loadstart', function(event) { alert(event.url); });</syntaxhighlight> | ref.addEventListener('loadstart', function(event) { alert(event.url); });</syntaxhighlight> | ||
==<code>InAppBrowser.removeEventListener</code>== | ==<code>InAppBrowser.removeEventListener</code>== | ||
يزيل هذا التابع مُنصِتا لحدثٍ من أحداث <code>InAppBrowser</code>. وهو متاح فقط عند ضبط الخيار <code>target</code> عند القيمة <code>'_blank'</code>. | يزيل هذا التابع مُنصِتا لحدثٍ من أحداث <code>InAppBrowser</code>. وهو متاح فقط عند ضبط الخيار <code>target</code> عند القيمة <code>'_blank'</code>. | ||
<syntaxhighlight lang="javascript">ref.removeEventListener(eventname, callback);</syntaxhighlight> | <syntaxhighlight lang="javascript">ref.removeEventListener(eventname, callback);</syntaxhighlight>المعاملات المُرَّرة إلى هذا التابع هي: | ||
* <code>ref</code>:يشير إلى النافذة <code>InAppBrowser</code>. | |||
*<code>eventname</code>: سلسلة نصية تمثل الحدثَ المُراد التوقف عن الإنصات له. | |||
* <code>eventname</code>: سلسلة نصية تمثل الحدثَ المُراد التوقف عن الإنصات له. | **<code>loadstart</code>: يُطلق هذا الحدث عندما يبدأ <code>InAppBrowser</code> في تحميل عنوان URL. | ||
** <code>loadstart</code>: يُطلق هذا الحدث عندما يبدأ <code>InAppBrowser</code> في تحميل عنوان URL. | **<code>loadstop</code>: يُطلق هذا الحدث عند انتهاء <code>InAppBrowser</code> من تحميل عنوان URL. | ||
** <code>loadstop</code>: يُطلق هذا الحدث عند انتهاء <code>InAppBrowser</code> من تحميل عنوان URL. | **<code>loaderror</code>: يُطلق هذا الحدث عندما يواجه <code>InAppBrowser</code> خطأ أثناء تحميل عنوان URL. | ||
** <code>loaderror</code>: يُطلق هذا الحدث عندما يواجه <code>InAppBrowser</code> خطأ أثناء تحميل عنوان URL. | **<code>exit</code>: يُطلق هذا الحدث عند إغلاق نافذةِ <code>InAppBrowser</code>. | ||
** <code>exit</code>: يُطلق هذا الحدث عند إغلاق نافذةِ <code>InAppBrowser</code>. | ** <code>message</code>: يُطلق هذا الحدث عندما يتلقى <code>InAppBrowser</code> رسالة من الصفحة التي تم تحميلها داخل [[Cordova/webviews|عارض]] <code>InAppBrowser</code> . | ||
* <code>callback</code>: دالة رد النداء التي سيتم تنفيذها عند إطلاق الحدث والتي سيُمرّر إليها الكائنٌ <code>InAppBrowserEvent</code>. | *<code>callback</code>: دالة رد النداء التي سيتم تنفيذها عند إطلاق الحدث والتي سيُمرّر إليها الكائنٌ <code>InAppBrowserEvent</code>. | ||
المنصات المدعومة هي: | المنصات المدعومة هي: | ||
*أندرويد | *أندرويد | ||
سطر 225: | سطر 290: | ||
var myCallback = function(event) { alert(event.url); } | var myCallback = function(event) { alert(event.url); } | ||
ref.addEventListener('loadstart', myCallback); | ref.addEventListener('loadstart', myCallback); | ||
ref.removeEventListener('loadstart', myCallback); | ref.removeEventListener('loadstart', myCallback); | ||
</syntaxhighlight> | |||
==<code>InAppBrowser.close</code>== | ==<code>InAppBrowser.close</code>== | ||
سطر 266: | سطر 332: | ||
==<code>InAppBrowser.executeScript</code>== | ==<code>InAppBrowser.executeScript</code>== | ||
يحقن (Injects) هذا التابع شيفرة [[JavaScript|JavaScript]] في نافذة <code>InAppBrowser</code>. (متاح فقط عند ضبط الخيار <code>target</code> عند القيمة <code>'_blank'</code>). | يحقن (Injects) هذا التابع شيفرة [[JavaScript|JavaScript]] في نافذة <code>InAppBrowser</code>. (متاح فقط عند ضبط الخيار <code>target</code> عند القيمة <code>'_blank'</code>). | ||
<syntaxhighlight lang="javascript">ref.executeScript(details, callback);</syntaxhighlight> | <syntaxhighlight lang="javascript">ref.executeScript(details, callback);</syntaxhighlight>المعاملات المُمرَّرة إلى هذا التابع هي: | ||
* <code>ref</code>: يشير إلى نافذة <code>InAppBrowser</code>. | |||
* <code>injectDetails</code>: كائن يمثل تفاصيل البرنامج النصي المراد تنفيذه، مع تحديد أحد المفتاحين <code>file</code> أو <code>code</code>. | * <code>injectDetails</code>: كائن يمثل تفاصيل البرنامج النصي المراد تنفيذه، مع تحديد أحد المفتاحين <code>file</code> أو <code>code</code>. | ||
** <code>file</code>: عنوان النص المراد حقنُه. | ** <code>file</code>: عنوان النص المراد حقنُه. | ||
سطر 321: | سطر 388: | ||
قم بتجميع اختيارات المستخدمين في دالة الصفحة <code>onDeviceReady</code>، ثم أرسل عنوانًا (URL) مناسبًا لدالة المساعدة (helper function) في أحد ملفات المكتبة المشتركة. اسم دالة المساعدة في هذا المثال هو <code>showHelp()</code>، والتي سنعرّفها في الفقرة التالية. | قم بتجميع اختيارات المستخدمين في دالة الصفحة <code>onDeviceReady</code>، ثم أرسل عنوانًا (URL) مناسبًا لدالة المساعدة (helper function) في أحد ملفات المكتبة المشتركة. اسم دالة المساعدة في هذا المثال هو <code>showHelp()</code>، والتي سنعرّفها في الفقرة التالية. | ||
<syntaxhighlight lang="javascript">$('#help-select').on('change', function (e) { | <syntaxhighlight lang="javascript">$('#help-select').on('change', function (e) { | ||
var url; | var url; | ||
switch (this.value) { | switch (this.value) { | ||
case "article": | case "article": | ||
url = "https://cordova.apache.org/docs/en/latest/" | url = "https://cordova.apache.org/docs/en/latest/" | ||
+ "reference/cordova-plugin-inappbrowser/index.html"; | + "reference/cordova-plugin-inappbrowser/index.html"; | ||
break; | break; | ||
case "video": | case "video": | ||
url = "https://youtu.be/F-GlVrTaeH0"; | url = "https://youtu.be/F-GlVrTaeH0"; | ||
break; | break; | ||
case "search": | case "search": | ||
url = "https://www.google.com/#q=inAppBrowser+plugin"; | url = "https://www.google.com/#q=inAppBrowser+plugin"; | ||
break; | break; | ||
} | } | ||
showHelp(url); | showHelp(url); | ||
}); | |||
});</syntaxhighlight> | |||
=== تحميل صفحة المساعدة === | === تحميل صفحة المساعدة === | ||
سنستخدم الدالة <code>open</code> لتحميل صفحة المساعدة. وسنضبط الخاصية <code>hidden</code> إلى القيمة <code>yes</code>، لكي نحرص على أن يُعرَض المتصفح بعد تحميل محتوى الصفحة. فبهذه الطريقة، لن يرى المستخدمون متصفحًا فارغًا أثناء انتظار ظهور المحتوى. عندما يُطلق الحدث <code>loadstop</code>، سنعرف متى تم تحميل المحتوى (سنتعامل مع هذا الحدث بعد قليل). | سنستخدم الدالة <code>open</code> لتحميل صفحة المساعدة. وسنضبط الخاصية <code>hidden</code> إلى القيمة <code>yes</code>، لكي نحرص على أن يُعرَض المتصفح بعد تحميل محتوى الصفحة. فبهذه الطريقة، لن يرى المستخدمون متصفحًا فارغًا أثناء انتظار ظهور المحتوى. عندما يُطلق الحدث <code>loadstop</code>، سنعرف متى تم تحميل المحتوى (سنتعامل مع هذا الحدث بعد قليل). | ||
<syntaxhighlight lang="javascript">function showHelp(url) { | <syntaxhighlight lang="javascript">function showHelp(url) { | ||
var target = "_blank"; | var target = "_blank"; | ||
var options = "location=yes,hidden=yes"; | var options = "location=yes,hidden=yes"; | ||
inAppBrowserRef = cordova.InAppBrowser.open(url, target, options); | inAppBrowserRef = cordova.InAppBrowser.open(url, target, options); | ||
inAppBrowserRef.addEventListener('loadstart', loadStartCallBack); | inAppBrowserRef.addEventListener('loadstart', loadStartCallBack); | ||
inAppBrowserRef.addEventListener('loadstop', loadStopCallBack); | inAppBrowserRef.addEventListener('loadstop', loadStopCallBack); | ||
inAppBrowserRef.addEventListener('loaderror', loadErrorCallBack); | inAppBrowserRef.addEventListener('loaderror', loadErrorCallBack); | ||
} | |||
}</syntaxhighlight> | |||
=== إعلام المستخدمين بجاهزية صفحتهم === | === إعلام المستخدمين بجاهزية صفحتهم === | ||
سطر 357: | سطر 438: | ||
عندما يُطلق الحدث <code>loadstopcallback</code>، نعلم أن المحتوى قد حُمِّل، وحينها يمكننا إظهار المتصفح. هذه الحيلة ستخلق انطباعًا لدى المستخدم بسرعة التحميل. والحقيقة هي أنه، سواء أعرضت المتصفح قبل تحميل المحتوى أم لا، فإنّ وقت التحميل لن يتغير. | عندما يُطلق الحدث <code>loadstopcallback</code>، نعلم أن المحتوى قد حُمِّل، وحينها يمكننا إظهار المتصفح. هذه الحيلة ستخلق انطباعًا لدى المستخدم بسرعة التحميل. والحقيقة هي أنه، سواء أعرضت المتصفح قبل تحميل المحتوى أم لا، فإنّ وقت التحميل لن يتغير. | ||
<syntaxhighlight lang="javascript">function loadStopCallBack() { | <syntaxhighlight lang="javascript">function loadStopCallBack() { | ||
if (inAppBrowserRef != undefined) { | if (inAppBrowserRef != undefined) { | ||
inAppBrowserRef.insertCSS({ code: "body{font-size: 25px;" }); | inAppBrowserRef.insertCSS({ code: "body{font-size: 25px;" }); | ||
$('#status-message').text(""); | $('#status-message').text(""); | ||
inAppBrowserRef.show(); | inAppBrowserRef.show(); | ||
} | } | ||
} | |||
}</syntaxhighlight> | |||
ربما لاحظت استدعاء الدالة <code>insertCSS</code>. هذا لا يخدم أي غرض معين في مثالنا هذا. ولكنه يعطيك فكرة عن كيفية استخدامها. في هذه الحالة، سنتأكد فقط من أنّ حجم خط صفحاتك يساوي قيمة معينة. يمكنك استخدام هذه الدالة لإدراج أنماط [[CSS]] التي تريد. ويمكنك حتى الإشارة إلى ملف CSS في مشروعك. | ربما لاحظت استدعاء الدالة <code>insertCSS</code>. هذا لا يخدم أي غرض معين في مثالنا هذا. ولكنه يعطيك فكرة عن كيفية استخدامها. في هذه الحالة، سنتأكد فقط من أنّ حجم خط صفحاتك يساوي قيمة معينة. يمكنك استخدام هذه الدالة لإدراج أنماط [[CSS]] التي تريد. ويمكنك حتى الإشارة إلى ملف CSS في مشروعك. | ||
سطر 371: | سطر 457: | ||
سنحاول إظهار الخطأ في مربعٍ يعرض رسالة. يمكننا القيام بذلك عن طريق حقن برنامج نصي يستدعي الدالة <code>alert</code>. المشكلة في هذا أنه لن يعمل على متصفحات ويندوز، لذا سيتعين علينا التحقق من قيمة معامل دالة رد النداء <code>executeScript</code> لمعرفة ما إذا كانت المحاولة ناجحة. إذا لم ينجح الأمر، فسنكتفي بعرض رسالة الخطأ في وسم <code><nowiki><div></nowiki></code> داخل الصفحة: | سنحاول إظهار الخطأ في مربعٍ يعرض رسالة. يمكننا القيام بذلك عن طريق حقن برنامج نصي يستدعي الدالة <code>alert</code>. المشكلة في هذا أنه لن يعمل على متصفحات ويندوز، لذا سيتعين علينا التحقق من قيمة معامل دالة رد النداء <code>executeScript</code> لمعرفة ما إذا كانت المحاولة ناجحة. إذا لم ينجح الأمر، فسنكتفي بعرض رسالة الخطأ في وسم <code><nowiki><div></nowiki></code> داخل الصفحة: | ||
<syntaxhighlight lang="javascript">function loadErrorCallBack(params) { | <syntaxhighlight lang="javascript">function loadErrorCallBack(params) { | ||
$('#status-message').text(""); | $('#status-message').text(""); | ||
var scriptErrorMesssage = | var scriptErrorMesssage = | ||
"alert('Sorry we cannot open that page. Message from the server is : " | "alert('Sorry we cannot open that page. Message from the server is : " | ||
+ params.message + "');" | + params.message + "');" | ||
inAppBrowserRef.executeScript({ code: scriptErrorMesssage }, executeScriptCallBack); | inAppBrowserRef.executeScript({ code: scriptErrorMesssage }, executeScriptCallBack); | ||
inAppBrowserRef.close(); | inAppBrowserRef.close(); | ||
inAppBrowserRef = undefined; | inAppBrowserRef = undefined; | ||
} | } | ||
function executeScriptCallBack(params) { | function executeScriptCallBack(params) { | ||
if (params[0] == null) { | if (params[0] == null) { | ||
$('#status-message').text( | $('#status-message').text( | ||
"Sorry we couldn't open that page. Message from the server is : '" | "Sorry we couldn't open that page. Message from the server is : '" | ||
+ params.message + "'"); | + params.message + "'"); | ||
} | } | ||
} | |||
}</syntaxhighlight><span></span> | |||
== معلومات استخدام إضافية == | == معلومات استخدام إضافية == | ||
=== العناوين المحلية (المصدر في حزمة التطبيق) === | === العناوين المحلية (المصدر في حزمة التطبيق) === |
المراجعة الحالية بتاريخ 19:30، 3 ديسمبر 2020
تساعد إضافة المتصفح الداخلي (cordova-plugin-inappbrowser) على عرض المقالات ومقاطع الفيديو وموارد الويب المفيدة داخل تطبيقك. كما تمُكن المستخدمين أيضًا من الاطلاع على صفحات الويب دون مغادرة التطبيق.
لمعرفة كيفية استخدام هذه الإضافة، اطلع على المثال التوضيحي في نهاية هذه الصفحة.
توفر هذه الإضافة مُتصفحًا يمكن عرضه عند استدعاء التابع cordova.InAppBrowser.open()
.
var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
لقد تم تعريف التابع cordova.InAppBrowser.open()
ليكون بديلًا للدالة window.open()
. يمكن لاستدعاءات الدالةwindow.open()
الحالية أن تستخدم نافذةَ InAppBrowser
عن طريق استبدال window.open
كما هو موضح في المثال التالي:
window.open = cordova.InAppBrowser.open;
تتصرف النافذة InAppBrowser
كمتصفح عادي، ولا يمكنها الوصول إلى الواجهات البرمجية لكوردوفا. لهذا السبب، يُنصَح باستخدام InAppBrowser
إذا احتجت إلى تحميل محتوى خارجي (غير موثوق به)، بدلًا من تحميله في عارض كوردوفا الرئيسي. InAppBrowser
ليس معنيًا باللوائح البيضاء، ولا يفتح روابط في متصفح النظام.
يوفر InAppBrowser
بشكل افتراضي عناصر الواجهة الرسومية (GUI) للمستخدم (back, forward, done).
للتوافق مع الإصدارات القديمة، تربط هذه الإضافةُ الدالةَ window.open
مع خطّاف. لكن يمكن أن يكون للخطّاف الذي رُبطَت فيه الدالة window.open
تأثيرات جانبية غير مقصودة (خاصة إذا تم تضمين هذه الإضافة كارتباط لإضافة أخرى). سيُزال خطاف الدالة window.open
في الإصدار الرئيسي مستقبلًا. إلى حين إزالة ذلك الخطاف من الإضافة، يمكن للتطبيقات استعادة السلوك الافتراضي يدويًا عبر تنفيذ الأمر التالي:
delete window.open // إعادة رد النداء إلى وضعه الافتراضي
على الرغم من أنَّ الدالة window.open
موجودة في النطاق العام، إلا أنّ الكائن InAppBrowser
لن يكون متوفرًا إلا بعد إطلاق الحدث deviceready
.
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
console.log("window.open works well");
}
التثبيت
يمكنك تثبيت هذه الإضافة عبر الأمر التالي:
cordova plugin add cordova-plugin-inappbrowser
إن كنت تريد أن تُعرض جميع الصفحات المُحملة في تطبيقك في نافذة InAppBrowser
، يمكنك ببساطة أن تربط الدالة window.open
بخطاف أثناء التهيئة. إليك المثال التالي:
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
window.open = cordova.InAppBrowser.open;
}
cordova.InAppBrowser.open
يفتح هذا التابع عنوانًا في نسخة جديدة (instance) من InAppBrowser
، أو في نسخة من المتصفح الحالي، أو في متصفح النظام:
var ref = cordova.InAppBrowser.open(url, target, options);
المعاملات المُمرَّرة إلى هذه الدالة هي:
ref
: يشير إلى النافذةInAppBrowser
عندما يُضبَط المعاملtarget
إلى القيمة'_blank'
. (InAppBrowser
)
url
: سلسلة نصية تمثِّل العنوان المراد تحميله. مرّر هذا المعامل إلى الدالةَencodeURI()
إن كان العنوان يحتوي على محارف يونيكود.
target
: سلسلة نصية تحدِّد المكان الذي سيُحمّل فيه العنوان. وهو معامل اختياري، قيمته الافتراضية تساوي _self
._self
: يُفتح في عارض كوردوفا إن كان العنوان مُدرجًا في اللائحة البيضاء، وإلا فسيُفتح في نافذةInAppBrowser
._blank
: يُفتح فيInAppBrowser
._system
: يفتح في متصفح النظام.
options
: سلسلة نصية تحوي خيارات النافذةInAppBrowser
. وهو معامل اختياري، وقيمته الافتراضية هيlocation=yes
. يجب ألا تحتوي السلسلة النصيةoptions
على أية مسافة فارغة، ويجب أن تُفصل الأزواج اسم/قيمة (name/value) للميزات بفاصلة. كما أنّ أسماء الميزات غير حساسة لحالة الأحرف.
تدعم جميع المنصات الخيار التالي:
location
: اضبط هذه الخاصية إلى القيمةyes
أوno
لإظهار شريط التصفح (location bar) فيInAppBrowser
أو إخفائه.
تدعم منصة أندرويد هذه الخيارات الإضافية:
hidden
: اضبط هذا الخيار إلى القيمةyes
لإنشاء المتصفح وتحميل الصفحة بدون إظهاره. يُطلق الحدثloadstop
عند اكتمال التحميل. احذف هذا الخيار أو اضبطه إلى القيمةno
(القيمة الافتراضية) لفتح المتصفح وتحميل الصفحة بشكل طبيعي.beforeload
: عين هذا الخيار لتمكين الحدثBeforeeload
من تعديل الصفحات التي حُمِّلت فعليا في المتصفح. القيم المقبولة هي:get
: لاعتراض طلبات GET فقطpost
: لاعتراض طلبات POSTyes
: لاعتراض طلبات GET و POST معا. لاحظ أنّ طلبات POST غير مدعومة حاليًا وستُتجاهل (إذا قمت بتعيين القيمةbeforeload = post
، فسيؤدي ذلك إلى إطلاق خطأ).
cbeforeloadlearcache
: اضبط هذا الخيار إلى القيمةyes
لمحو ذاكرة التخزين المؤقت لملفات تعريف الارتباط (cookie cache) في المتصفح قبل فتح النافذة الجديدةclearsessioncache
: اضبط هذا الخيار إلى القيمةyes
لمحو ذاكرة التخزين المؤقت لملفات تعريف الارتباط قبل فتح النافذة الجديدةclosebuttoncaption
: أعطِ لهذا الخيار سلسلةً نصيةً لاستخدامها كتسميةٍ للزر بدلًا من الحرفX
. تذكّر أنه سيكون عليك مراعاة الإعدادات اللغوية المحلية بنفسك.closebuttoncolor
: أعطِ لهذا الخيار سلسلةً نصيةً تمثل قيمة لونية ست عشرية (hex color) صالحة، مثل: #00ff00
، لأجل تغيير لون زر الإغلاق الافتراضي، سواءً كان نصًا، أو كان يساوي القيمة الافتراضيةX
. لا يكون لهذا الخيار تأثير إلا إن كان المستخدم قد عيّن الخيارlocation
إلى القيمةyes
.footer
: اضبط هذا الخيار إلى القيمةyes
لإظهار زر الإغلاق في أسفل النافذة بشكل مماثلٍ للزرDone
في منصة iOS، سيظهر زر الإغلاق بشكل مماثلٍ لترويسة (header) النافذة، لذلك استخدمclosebuttoncaption
وclosebuttoncolor
لتعيين خصائصه.footercolor
: أعطِ لهذا الخيار سلسلةً نصيةً تمثل لونًا ست عشريًا (hex color) صالحًا، مثل #00ff00
أو #CC00ff00
(#aarrggbb
)، لتغيير لون تذييل (footer) النافذة الافتراضي. ليس لهذا الخيار تأثيرٌ إلا إن عيّن المُستخدم الخيارَfooter
إلى القيمةyes
.hardwareback
: اضبط هذا الخيار إلى القيمةyes
لاستخدام زر الرجوع الخاص بالجهاز للرجوع للخلف إلى الصفحات الموجودة في تاريخ نافذةInAppBrowser
(الصفحات التي جرى زيارتها من قبل). إذا لم تكن هناك صفحات سابقة، فسيتم إغلاقInAppBrowser
. القيمة الافتراضية هيyes
، إن كنت تريد أن تجعل زر الرجوع يغلق نافذةInAppBrowser
، فعيّن هذا الخيار إلى القيمةno
.hidenavigationbuttons
: اضبط هذا الخيار إلى القيمةyes
لإخفاء أزرار التصفح (navigation buttons) على شريط التصفح (location toolbar)، ليس لهذا الخيار تأثير إلا إن كان المستخدم قد عيّن الخيارlocation
إلى القيمةyes
. القيمة الافتراضية هيno
.hideurlbar
: اضبط هذا الخيار إلى القيمةyes
لإخفاء شريط العنوان من شريط التصفح، ليس لهذا الخيار تأثيرًا إلا إن كان المستخدم قد عيّن الخيارlocation
إلى القيمةyes
. القيمة الافتراضية هيno
.navigationbuttoncolor
: أعطِ لهذا الخيار سلسلة نصية تمثل لونًا ست عشريًا (hex color) صالحًا، مثل: #00ff00
، لتغيير لون أزرار التصفح الافتراضي. ليس لهذا الخيار تأثير إلا إن كان المستخدم قد عيّن الخيارlocation
إلى القيمةyes
، وكانت قيمة الخيارhidenavigationbuttons
تخالفyes
.toolbarcolor
: أعطِ لهذا الخيار سلسلة نصية تمثل لونًا ست عشريًا صالحًا، مثل: #00ff00
، لتغيير لون شريط الأدوات الافتراضي. ليس لهذا الخيار تأثيرًا إلا إن كان المستخدم قد عيّن الخيارlocation
إلى القيمةyes
.lefttoright
: اضبط هذا الخيار إلى القيمةyes
لأجل تبديل مواضع أزرار التنقل وزر الإغلاق. على وجه التحديد، ستتحول أزرار التنقل إلى الزر الأيسر وينتقل زر الإغلاق إلى اليمين.zoom
: اضبط هذا الخيار إلى القيمةyes
لعرض عناصر التحكم في الحجم في متصفح أندرويد، أو اضبطه إلى القيمةno
إن أردت إخفاءها. القيمة الافتراضية هيyes
.mediaPlaybackRequiresUserAction
: اضبط هذا الخيار إلى القيمةyes
لمنع صوتيات أو فيديوها HTML5 من التشغيل التلقائي. القيمة الافتراضية هيno
.shouldPauseOnSuspend
: اضبط هذا الخيار إلى القيمةyes
لإيقاف عارضInAppBrowser
أو استئنافه مع التطبيق، وذلك لإيقاف صوت الخلفية (قد يكون هذا ضروريًا لتجنب المشكلات التي تخص Google Play كما هو موضح في الصفحة CB-11013).useWideViewPort
: يحدِّد هذا الخيار ما إذا كان العارض سيدعم وسم HTML الوصفي "viewport
"، أو أنّ عليه أن يستخدم إطار عرضٍ (viewport) واسعٍ. عندما يُعطَى هذا الخيار القيمةno
، سيُعيّن عرض المخطط (layout) إلى قيمة العرض في العارض محسوبةً بوحدات بكسل مستقلة عن الجهاز المُستخدم (device-independent pixels). إن أُعطي هذا الخيار القيمةyes
وكانت الصفحة تحتوي الوسم الوصفيviewport
، فستُستخدَم قيمة العرض المحددة في الوسم. إن لم تحتوِ الصفحة على الوسم، أو لم تحدد قيمةً للعرض، فسيُستخدم إطار عرضٍ واسعٍ. القيمة الافتراضية هيyes
.
تدعم منصة iOS الخيارات الإضافية التالية:
usewkwebview
: اضبط هذا الخيار إلى القيمةyes
لأجل استخدام محركWKWebView
فيInappBrowser
. احذف الخيار أو أو اضبطه إلى القيمةno
لأجل استخدامUIWebView
. ملاحظة: يتطلب استخدامusewkwebview=yes
تثبيت إضافة محركWKWebView
في مشروع كوردوفا (مثل cordova-plugin-wkwebview أو cordova-plugin-ionic-webview).
hidden
: اضبط هذا الخيار إلى القيمةyes
لإنشاء المتصفح وتحميل الصفحة، ولكن دون إظهاره. سيُطلق الحدثloadstop
عند اكتمال التحميل. احذف هذا الخيار أو اضبطه إلى القيمةno
(الافتراضية) لفتح المتصفح وتحميله بشكل طبيعي.beforeload
: عين هذا الخيار لتمكين الحدثBeforeeload
من تعديل الصفحات التي حُمِّلت فعليا في المتصفح. القيم المقبولة هي:get
: لاعتراض طلبات GET فقطpost
: لاعتراض طلبات POSTyes
: لاعتراض طلبات GET و POST معا. لاحظ أنّ طلبات POST غير مدعومة حاليًا وستُتجاهل (إذا قمت بتعيين القيمةbeforeload = post
، فسيؤدي ذلك إلى إطلاق خطأ).
clearcache
: اضبط هذا الخيار إلى القيمةyes
لمحو ذاكرة التخزين المؤقت لملفات تعريف الارتباط (cookie cache) للمتصفح قبل فتح النافذة الجديدةclearsessioncache
: اضبط هذا الخيار إلى القيمةyes
لمحو ذاكرة التخزين المؤقت لملفات تعريف الارتباط قبل فتح النافذة الجديدة.closebuttoncolor
: أعطِ لهذا الخيار سلسلةً نصيةً تمثل لونًا ست عشريًا (hex color) صالحًا، مثل: #00ff00
، لتغيير لون الزرDone
الافتراضي. لا يُطبق هذا الإعداد إلا عند تفعيل شريط الأدوات.cleardata
: اضبط هذا الخيار إلى القيمةyes
لمسح كامل التخزين المحلي للمتصفح (ملفات تعريف الارتباط، وتخزين HTML5 المحلي، و IndexedDB ...) قبل فتح النافذة الجديدة.closebuttoncaption
: أعطِ لهذا الخيار سلسلةً نصيةً لاستخدامها كتسميةِ للزرDone
. تذكر أن عليك مراعاة الإعدادات اللغوية المحلية بنفسك.disallowoverscroll
: يُضبط هذا الخيار إلى القيمةyes
أوno
(القيمة الافتراضية هيno
) لتشغيل أو إيقاف الخاصيةUIWebViewBounce
.hidenavigationbuttons
: اضبط هذا الخيار إلى القيمةyes
أوno
لإظهار أزرار التصفح (navigation buttons) في شريط الأدوات أو إخفائها (القيمة الافتراضية هيno
). لا يُطبّق هذا الخيار إلا عند تفعيل شريط الأدوات.navigationbuttoncolor
: أعطِ لهذا الخيار سلسلةًً نصيةًً تمثل لونًا ست عشريًا (hex color) صالحًا، مثل: #00ff00
، لتغيير اللون الافتراضي. لا يُطبّق هذا الخيار إلا عند إظهار أزرار التصفح.toolbar
: أعطِ لهذا الخيار القيمةyes
أوno
لإظهار شريط الأدوات أو إخفائه في نافذةInAppBrowser
(القيمة الافتراضية هيyes
).toolbarcolor
: أعطِ لهذا الخيار سلسلةً نصيةً تمثل لونًا ست عشريًا (hex color) صالحًا، مثل: #00ff00
، لتغيير اللون الافتراضي لشريط الأدوات. لا يُطبّق هذا الخيار إلا عند تفعيل شريط الأدوات.toolbartranslucent
: أعطِ لهذا الخيار القيمةyes
أوno
لجعل شريط الأدوات شبه شفاف (translucent). القيمة الافتراضية هيyes
. لا يُطبّق هذا الخيار إلا عند تفعيل شريط الأدوات.lefttoright
: اضبط هذا الخيار إلى القيمةyes
لأجل تبديل مواضع أزرار التنقل وزر الإغلاق. على وجه التحديد، ستتحول أزرار التنقل إلى الزر الأيسر وينتقل زر الإغلاق إلى اليمين.enableViewportScale
: اضبط هذا الخيار إلى القيمةyes
أوno
لمنع تعديل حجم إطار العرض (viewport) عبر الوسم <meta> الوصفي. القيمة الافتراضية هيno
.mediaPlaybackRequiresUserAction
: اضبط هذا الخيار إلى القيمةyes
لمنع صوتيات أو فيديوهات HTML5 من التشغيل التلقائي. القيمة الافتراضية هيno
.allowInlineMediaPlayback
: اضبط هذا الخيار إلى القيمةyes
أوno
للسماح بتشغيل وسائط HTML5 المُدرجة على السطر (in-line)، وعرضها في نافذة المتصفح بدلًا من واجهة تشغيلٍ خاصةٍ بالجهاز. يجب أن يشتمل عنصرvideo
في HTML على الخاصيةwebkit-playsinline
. القيمة الافتراضية هيno
.keyboardDisplayRequiresUserAction
: اضبط هذا الخيار إلى القيمةyes
أوno
لفتح لوحة المفاتيح عندما تتلقى عناصر النموذج (form) التركيز (focus) عبر استدعاء دالة جافاسكريبتfocus()
. القيمة الافتراضية هيyes
.suppressesIncrementalRendering
: اضبط هذا الخيار إلى القيمةyes
أوno
للانتظار حتى يتم استلام كل محتوى إطار العرض الجديد قبل عرضه. القيمة الافتراضية هيno
.presentationstyle
: اعط لهذا الخيار القيمةpagesheet
أوformsheet
أوfullscreen
لتعيين نمط العرض. القيمة الافتراضية هيfullscreen
.transitionstyle
: اعط لهذا الخيار القيمةfliphorizontal
أوcrossdissolve
أوcoververtical
لتعيين نمط الانتقال. القيمة الافتراضية هيcoververtical
.toolbarposition
: اضبط هذا الخيار إلى القيمةtop
أوbottom
لجعل شريط الأدوات في أعلى النافذة أو أسفلها. القيمة الافتراضية هيbottom
.hidespinner
: اضبط هذا الخيار إلى القيمةyes
أوno
لتغيير رؤية (visibility) مؤشر التحميل. القيمة الافتراضية هيno
.
تدعم منصة ويندوز الخيارات الإضافية التالية:
hidden
: اضبط هذا الخيار إلى القيمةyes
لإنشاء المتصفح وتحميل الصفحة دون إظهاره. يُطلَق الحدثloadstop
عند اكتمال التحميل. احذف هذا الخيار أو اضبطه إلى القيمةno
(القيمة الافتراضية) لفتح المتصفح وتحميله بشكل طبيعي.hardwareback
: يعمل هذا الخيار بطريقة مشابهة لعمله على منصة أندرويد.fullscreen
: اضبط هذا الخيار إلى القيمةyes
لإنشاء متصفحٍ وعرضه بدون إحاطته بحدود. يرجى ملاحظة أنه إذا تم تحديد الخيارlocation=no
أيضًا، فلن يتوافر للمستخدم أي تحكم (control) لإغلاق النافذة IAB.
المنصات المدعومة هي:
- أندرويد
- Browser
- iOS
- OSX
- ويندوز
مثال عن استعمال cordova.InAppBrowser.open
:
var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
var ref2 = cordova.InAppBrowser.open(encodeURI('http://ja.m.wikipedia.org/wiki/ハングル'), '_blank', 'location=yes');
ملاحظات خاصة بمنصة OSX
في الوقت الحالي، القيمة الوحيدة المدعومة للمعامل target
في منصة OSX هي _system
.
لم يتم بعدُ تقديم الهدفين _blank
و _self
، وسيُتاجهلان بصمت.
ملاحظات خاصة بالمتصفحات (Browsers)
- تُقدِّم هذه الإضافة عبر الإطار الذكي iframe،
- لم يتم تقديم تاريخ التصفح (Navigation history) بعدُ (أي الزِّرين
back
وforward
في شريط التصفحLocationBar
).
الكائن InAppBrowser
يمثل الكائن المُعاد من استدعاء التابع cordova.InAppBrowser.open
عند تعيين المعامل target
إلى القيمة '_blank'
.
التوابع التي يمكن استعمالها معه هي:
addEventListener
removeEventListener
close
show
hide
executeScript
insertCSS
InAppBrowser.addEventListener
يضيف هذا التابع مُنصتًا (listener) لحدثٍ من InAppBrowser
. (متاح فقط عند ضبط الخيار target
إلى القيمة '_blank'
).
ref.addEventListener(eventname, callback);
المعاملات المُرَّرة إلى هذا التابع هي:
ref
: يشير إلى نافذةInAppBrowser
(InAppBrowser).
eventname
: سلسلة نصية تمثِّل الحدث المُراد ربط منصت به.loadstart
: يُطلق هذا الحدث عندما يبدأInAppBrowser
في تحميل عنوان URL.loadstop
: يُطلق هذا الحدث عند انتهاءInAppBrowser
من تحميل عنوان URL.loaderror
: يُطلق هذا الحدث عندما يواجهInAppBrowser
خطأً أثناء تحميل عنوان URL.exit
: يُطلق هذا الحدث عند إغلاق نافذةInAppBrowser
.beforeload
: يُطلق هذا الحدث عندما يقررInAppBrowser
إن كان سيُحمِّل عنوان URL أو لا (فقط عند تعيين الخيارbeforeload
)message
: يُطلق هذا الحدث عندما يتلقىInAppBrowser
رسالة من الصفحة التي تم تحميلها داخل عارضInAppBrowser
.
callback
: دالة رد النداء التي ستنفذ عند إطلاق الحدث. يُمرّر إليها الكائنInAppBrowserEvent
كمعاملٍ.
إليك المثال التالي:
var inAppBrowserRef;
function showHelp(url) {
var target = "_blank";
var options = "location=yes,hidden=yes,beforeload=yes";
inAppBrowserRef = cordova.InAppBrowser.open(url, target, options);
inAppBrowserRef.addEventListener('loadstart', loadStartCallBack);
inAppBrowserRef.addEventListener('loadstop', loadStopCallBack);
inAppBrowserRef.addEventListener('loaderror', loadErrorCallBack);
inAppBrowserRef.addEventListener('beforeload', beforeloadCallBack);
inAppBrowserRef.addEventListener('message', messageCallBack);
}
function loadStartCallBack() {
$('#status-message').text("loading please wait ...");
}
function loadStopCallBack() {
if (inAppBrowserRef != undefined) {
inAppBrowserRef.insertCSS({ code: "body{font-size: 25px;" });
inAppBrowserRef.executeScript({ code: "\
var message = 'this is the message';\
var messageObj = {my_message: message};\
var stringifiedMessageObj = JSON.stringify(messageObj);\
webkit.messageHandlers.cordova_iab.postMessage(stringifiedMessageObj);"
});
$('#status-message').text("");
inAppBrowserRef.show();
}
}
function loadErrorCallBack(params) {
$('#status-message').text("");
var scriptErrorMesssage =
"alert('Sorry we cannot open that page. Message from the server is : "
+ params.message + "');"
inAppBrowserRef.executeScript({ code: scriptErrorMesssage }, executeScriptCallBack);
inAppBrowserRef.close();
inAppBrowserRef = undefined;
}
function executeScriptCallBack(params) {
if (params[0] == null) {
$('#status-message').text(
"Sorry we couldn't open that page. Message from the server is : '"
+ params.message + "'");
}
}
function beforeloadCallBack(params, callback) {
if (params.url.startsWith("http://www.example.com/")) {
// Load this URL in the inAppBrowser.
callback(params.url);
} else {
// The callback is not invoked, so the page will not be loaded.
$('#status-message').text("This browser only opens pages on http://www.example.com/");
}
}
function messageCallBack(params){
$('#status-message').text("message received: "+params.data.my_message);
}
خاصيات الكائن InAppBrowserEvent
الخاصيات المتاحة لاستعمالها مع الكائن InAppBrowserEvent
هي:
type
: سلسلة نصية تمثِّل اسم الحدث، والذي يساوي إمّاloadstart
أوloadstop
أوloaderror
أوexit
.url
: سلسلة نصية تشير إلى العنوان الذي تم تحميله.code
: عدد يمثِّل رمز الخطأ. لا تكون هذه الخاصية مُتاحةً إلا في حال إطلاق الحدثloaderror
.message
: سلسلة نصية تمثِّل رسالة الخطأ، لا تكون هذه الخاصية مُتاحةً إلا في حال إطلاق الحدثloaderror
.data
: محتويات الرسالة، لا تعمل إلا في حال تعيينmessage
. وهي كائن JSON (سلسلة نصية).
المنصات المدعومة هي:
- أندرويد
- Browser
- iOS
- ويندوز
- OSX
ملاحظات خاصة بالمتصفحات (Browsers)
في هذه المنصات، لا تُطلق الأحداث loadstart
و loaderror
و message
.
ملاحظات خاصة بويندوز
في هذه المنصة، لا يُطلق الحدث message
.
إليك مثالا سريعا عن التابع addEventListener
:
var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
ref.addEventListener('loadstart', function(event) { alert(event.url); });
InAppBrowser.removeEventListener
يزيل هذا التابع مُنصِتا لحدثٍ من أحداث InAppBrowser
. وهو متاح فقط عند ضبط الخيار target
عند القيمة '_blank'
.
ref.removeEventListener(eventname, callback);
المعاملات المُرَّرة إلى هذا التابع هي:
ref
:يشير إلى النافذةInAppBrowser
.
eventname
: سلسلة نصية تمثل الحدثَ المُراد التوقف عن الإنصات له.loadstart
: يُطلق هذا الحدث عندما يبدأInAppBrowser
في تحميل عنوان URL.loadstop
: يُطلق هذا الحدث عند انتهاءInAppBrowser
من تحميل عنوان URL.loaderror
: يُطلق هذا الحدث عندما يواجهInAppBrowser
خطأ أثناء تحميل عنوان URL.exit
: يُطلق هذا الحدث عند إغلاق نافذةِInAppBrowser
.message
: يُطلق هذا الحدث عندما يتلقىInAppBrowser
رسالة من الصفحة التي تم تحميلها داخل عارضInAppBrowser
.
callback
: دالة رد النداء التي سيتم تنفيذها عند إطلاق الحدث والتي سيُمرّر إليها الكائنٌInAppBrowserEvent
.
المنصات المدعومة هي:
- أندرويد
- Browser
- iOS
- ويندوز
إليك المثال التالي عن استعمال التابع removeEventListener
:
var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
var myCallback = function(event) { alert(event.url); }
ref.addEventListener('loadstart', myCallback);
ref.removeEventListener('loadstart', myCallback);
InAppBrowser.close
يغلق هذا التابع نافذة InAppBrowser
.
ref.close();
المتغير ref
يُشير إلى نافذة InAppBrowser
(InAppBrowser).
المنصات المدعومة هي:
- أندرويد
- Browser
- iOS
- ويندوز
مثال عن استعمال التابع close
:
var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
ref.close();
InAppBrowser.show
يُظهر هذا التابع نافذة InAppBrowser
فُتِحت وهي مخفية. استدعاء هذا التابع لن يكون له أي تأثير إن كانت نافذة InAppBrowser
مرئيًةً.
ref.show();
المتغير ref
يُشير إلى نافذة InAppBrowser
.
المنصات المدعومة هي:
- أندرويد
- Browser
- iOS
- ويندوز
الق نظرة على المثال التالي:
var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'hidden=yes');
// ...بعد برهة من الزمن
ref.show();
InAppBrowser.hide
يُخفي هذا التابع نافذة InAppBrowser
. استدعاء هذا التابع ليس له أي تأثير إن كانت نافذة InAppBrowser
مخفيًةً مسبقًا.
ref.hide();
المتغير ref
يُشير إلى نافذة InAppBrowser
.
المنصات المدعومة هي:
- أندرويد
- iOS
- ويندوز
إليك المثال التالي:
var ref = cordova.InAppBrowser.open('http://apache.org', '_blank');
// ...بعد بُرهة
ref.hide();
InAppBrowser.executeScript
يحقن (Injects) هذا التابع شيفرة JavaScript في نافذة InAppBrowser
. (متاح فقط عند ضبط الخيار target
عند القيمة '_blank'
).
ref.executeScript(details, callback);
المعاملات المُمرَّرة إلى هذا التابع هي:
ref
: يشير إلى نافذةInAppBrowser
.
injectDetails
: كائن يمثل تفاصيل البرنامج النصي المراد تنفيذه، مع تحديد أحد المفتاحينfile
أوcode
.file
: عنوان النص المراد حقنُه.code
: نص الشيفرة البرمجية المراد حقنُها.
callback
: دالة رد النداء التي ستُنفّذ بعد حقن شيفرة JavaScript.- إن كان البرنامج النصي المحقون من النوع
code
، فسُينفّذ رد النداء (callback) مع إعطائه معاملًا واحدًا، والذي يساوي القيمة التي يُعيدها البرنامج النصي مُغلّفةً في مصفوفةٍ (Array
). بالنسبة للنصوص النصية متعددة الأسطر، فالقيمة ستساوي قيمة آخر تعليمة (statement)، أو آخر تعبير (expression) مُقيّمٍ.
- إن كان البرنامج النصي المحقون من النوع
المنصات المدعومة هي:
- أندرويد
- Browser
- iOS
- ويندوز
إليك مثال عن استعمال التابع executeScript
:
var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
ref.addEventListener('loadstop', function() {
ref.executeScript({file: "myscript.js"});
});
ملاحظات خاصة بالمتصفحات (Browsers)
- لا تدعم هذه المنصة إلا المفتاح
code
.
ملاحظات خاصة بمنصة ويندوز
بحسَب توثيق MSDN، لا يمكن للبرنامج النصي المستدعى أن يُعيد إلا قيمًا نصيةً، وإلا فإنّ المعامل الذي سيُمرّر إلى رد النداء callback
سيساوي [null]
.
InAppBrowser.insertCSS
يحقن هذا التابع شيفرة CSS في نافذة InAppBrowser
(متاح فقط عند ضبط الخيار target
عند القيمة '_blank'
).
ref.insertCSS(details, callback);
المتغير ref
يُشير إلى نافذة InAppBrowser
.
injectDetails
: كائن يمثِّل تفاصيل البرنامج النصي المُراد تشغيله، مع تحديد أحد المفتاحينfile
أوcode
.file
: عنوان شيفرة الأنماط المراد حقنها.code
: محتوى شيفرة الأنماط المُراد حقنها.
callback
: الدالة التي ستُنفذ بعد حقن شيفرة CSS.
المنصات المدعومة هي:
- أندرويد
- iOS
- ويندوز
توضح الشيفرة التالية كيفية استعمال التابع insertCSS
:
var ref = cordova.InAppBrowser.open('http://apache.org', '_blank', 'location=yes');
ref.addEventListener('loadstop', function() {
ref.insertCSS({file: "mystyles.css"});
});
مثال توضيحي
يمكنك استخدام هذه الإضافة لعرض صفحات توثيقٍ في تطبيقك. بحيث يمكن للمستخدمين عرض وثائق المساعدة عبر الإنترنت ثمَّ إغلاقها دون مغادرة التطبيق.
في هذه الفقرة تجد بعض المقتطفات البرمجية التي توضح كيفية القيام بذلك.
منح المستخدمين طريقة لطلب المساعدة
هناك الكثير من الطرق لفعل هذا. وتُعد القوائم المنسدلة من أبسطها.
<select id="help-select">
<option value="default">Need help?</option>
<option value="article">Show me a helpful article</option>
<option value="video">Show me a helpful video</option>
<option value="search">Search for other topics</option>
</select>
قم بتجميع اختيارات المستخدمين في دالة الصفحة onDeviceReady
، ثم أرسل عنوانًا (URL) مناسبًا لدالة المساعدة (helper function) في أحد ملفات المكتبة المشتركة. اسم دالة المساعدة في هذا المثال هو showHelp()
، والتي سنعرّفها في الفقرة التالية.
$('#help-select').on('change', function (e) {
var url;
switch (this.value) {
case "article":
url = "https://cordova.apache.org/docs/en/latest/"
+ "reference/cordova-plugin-inappbrowser/index.html";
break;
case "video":
url = "https://youtu.be/F-GlVrTaeH0";
break;
case "search":
url = "https://www.google.com/#q=inAppBrowser+plugin";
break;
}
showHelp(url);
});
تحميل صفحة المساعدة
سنستخدم الدالة open
لتحميل صفحة المساعدة. وسنضبط الخاصية hidden
إلى القيمة yes
، لكي نحرص على أن يُعرَض المتصفح بعد تحميل محتوى الصفحة. فبهذه الطريقة، لن يرى المستخدمون متصفحًا فارغًا أثناء انتظار ظهور المحتوى. عندما يُطلق الحدث loadstop
، سنعرف متى تم تحميل المحتوى (سنتعامل مع هذا الحدث بعد قليل).
function showHelp(url) {
var target = "_blank";
var options = "location=yes,hidden=yes";
inAppBrowserRef = cordova.InAppBrowser.open(url, target, options);
inAppBrowserRef.addEventListener('loadstart', loadStartCallBack);
inAppBrowserRef.addEventListener('loadstop', loadStopCallBack);
inAppBrowserRef.addEventListener('loaderror', loadErrorCallBack);
}
إعلام المستخدمين بجاهزية صفحتهم
لا يظهر المتصفح على الفور، لذلك سنستخدم الحدث loadstart
لعرض رسالة الحالة (status message)، أو شريط التقدم (progress bar)، أو أي مؤشرٍ آخر. هذا يؤكد للمستخدمين أن المحتوى في خضمِّ التحميل.
function loadStartCallBack() {
$('#status-message').text("loading please wait ...");
}
عرض صفحة المساعدة
عندما يُطلق الحدث loadstopcallback
، نعلم أن المحتوى قد حُمِّل، وحينها يمكننا إظهار المتصفح. هذه الحيلة ستخلق انطباعًا لدى المستخدم بسرعة التحميل. والحقيقة هي أنه، سواء أعرضت المتصفح قبل تحميل المحتوى أم لا، فإنّ وقت التحميل لن يتغير.
function loadStopCallBack() {
if (inAppBrowserRef != undefined) {
inAppBrowserRef.insertCSS({ code: "body{font-size: 25px;" });
$('#status-message').text("");
inAppBrowserRef.show();
}
}
ربما لاحظت استدعاء الدالة insertCSS
. هذا لا يخدم أي غرض معين في مثالنا هذا. ولكنه يعطيك فكرة عن كيفية استخدامها. في هذه الحالة، سنتأكد فقط من أنّ حجم خط صفحاتك يساوي قيمة معينة. يمكنك استخدام هذه الدالة لإدراج أنماط CSS التي تريد. ويمكنك حتى الإشارة إلى ملف CSS في مشروعك.
معالجة أخطاء الصفحة
في بعض الأحيان، لا تكون الصفحة المراد تحميلها مُتاحةً، أو قد يكون هناك خطأ في البرنامج النصي، أو قد لا يملك المستخدم إذن الدخول إلى موردٍ ما. التعامل مع هذه الأوضاع، وطريقة ذلك متروكة لك ولتصميمك. يمكنك ترك المتصفح يعرض رسالة خطأ، أو يمكنك عرضها بطريقة أخرى.
سنحاول إظهار الخطأ في مربعٍ يعرض رسالة. يمكننا القيام بذلك عن طريق حقن برنامج نصي يستدعي الدالة alert
. المشكلة في هذا أنه لن يعمل على متصفحات ويندوز، لذا سيتعين علينا التحقق من قيمة معامل دالة رد النداء executeScript
لمعرفة ما إذا كانت المحاولة ناجحة. إذا لم ينجح الأمر، فسنكتفي بعرض رسالة الخطأ في وسم <div>
داخل الصفحة:
function loadErrorCallBack(params) {
$('#status-message').text("");
var scriptErrorMesssage =
"alert('Sorry we cannot open that page. Message from the server is : "
+ params.message + "');"
inAppBrowserRef.executeScript({ code: scriptErrorMesssage }, executeScriptCallBack);
inAppBrowserRef.close();
inAppBrowserRef = undefined;
}
function executeScriptCallBack(params) {
if (params[0] == null) {
$('#status-message').text(
"Sorry we couldn't open that page. Message from the server is : '"
+ params.message + "'");
}
}
معلومات استخدام إضافية
العناوين المحلية (المصدر في حزمة التطبيق)
var iab = cordova.InAppBrowser;
iab.open('local-url.html'); // يُحمّل في عارض كوردوفا
iab.open('local-url.html', '_self'); // يُحمّل في عارض كوردوفا
iab.open('local-url.html', '_system'); // خطأ أمني: متصفح النظام
// (iOS) ولكن لن يُحمّل العنوان
iab.open('local-url.html', '_blank'); // InAppBrowser يُحمّل في
iab.open('local-url.html', 'random_string'); // InAppBrowser يُحمّل في
iab.open('local-url.html', 'random_string', 'location=no'); // InAppBrowser يُحمّل في
// دون عرض شريط التصفح
محتوى مُدرج في اللائحة البيضاء
var iab = cordova.InAppBrowser;
iab.open('http://whitelisted-url.com'); // يُحمّل في عارض كوردوفا
iab.open('http://whitelisted-url.com', '_self'); // يُحمّل في عارض كوردوفا
iab.open('http://whitelisted-url.com', '_system'); // يُحمّل في متصفح النظام
iab.open('http://whitelisted-url.com', '_blank'); // InAppBrowser يُحمّل في
iab.open('http://whitelisted-url.com', 'random_string'); // InAppBrowser يُحمّل في
iab.open('http://whitelisted-url.com', 'random_string', 'location=no'); // يُحمّل في
// دون عرض شريط التصفح InAppBrowser
العناوين غير المُدرجة في اللائحة البيضاء
var iab = cordova.InAppBrowser;
iab.open('http://url-that-fails-whitelist.com'); // InAppBrowser يُحمّل في
iab.open('http://url-that-fails-whitelist.com', '_self'); //InAppBrowser يُحمّل في
iab.open('http://url-that-fails-whitelist.com', '_system'); // يُحمل في متصفح النظام
iab.open('http://url-that-fails-whitelist.com', '_blank'); // InAppBrowser يُحمّل في
iab.open('http://url-that-fails-whitelist.com', 'random_string'); // InAppBrowser يُحمّل في
iab.open('http://url-that-fails-whitelist.com', 'random_string', 'location=no');
// دون عرض شريط التصفح InAppBrowser يُحمّل في
انظر أيضًا
- إضافة حالة الجهاز
- إضافة تحديد الموقع الجغرافي
- إضافة الوصول إلى الملفات