2016-03-09 2 views
3

У меня есть проблема с notificationBox. Я create a notification с помощьюЗапретить закрытие уведомления XUL при нажатии кнопки

appendNotification(label , value , image , priority , buttons, eventCallback) 

и поставить кнопку в buttons аргумента. Теперь я хочу, чтобы окно уведомления не закрывалось, когда я нажал кнопку. В XUL Documentation говорится, что это можно сделать, бросая ошибку в функции eventCallback:

Этот обратный вызов может быть использован для предотвращения окна уведомления от закрытия по нажатию кнопки. В функции обратного вызова просто выдайте ошибку. (Например: throw new Error('prevent nb close');)

Это не работает для меня, однако, это работает, когда я добавить throw -statement к функции обратного вызова самой кнопки.

  1. Является ли это ошибкой в ​​XUL или несогласованностью с документацией?
  2. Есть ли какой-либо вред, добавив его в функцию обратного вызова кнопки?
+0

Без кода, этот вопрос может быть не по теме: Вопросы ищут отладки помощи ("** почему не этот код работает так, как я хочу ? ** ") должны включать: A) желаемое поведение; B) конкретная проблема или ошибка * и * C) ** кратчайший код, необходимый для его воспроизведения ** все *** в самом вопросе ***. Вопросы без ** ясного заявления о проблеме ** не полезны для других читателей. См. [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve), [о каких темах я могу спросить здесь?] (Http://stackoverflow.com/help/ по-теме) и [спросить]. – Makyen

+0

Существенной причиной, по которой требуется [mcve], является то, что мы хотим помочь. Нам очень легко помочь, если нам не нужно воссоздавать весь код, необходимый для проверки ситуации сами. Это код, который у вас уже есть, который мы должны были бы дублировать, чтобы проверить любую помощь, которую мы предоставляем вам. Поэтому, пожалуйста, помогите нам помочь вам и предоставите [mcve] такие вопросы. – Makyen

ответ

3

На мой взгляд, это ошибка в документации, которая не является ошибкой в ​​коде. Однако бросание ошибки в обратном вызове кнопки для предотвращения закрытия не является лучшим способом достижения этой цели.

  • Глядя на source code, были явно множественные несоответствия между кодом и the documentation относительно того, как кнопки работают на notification.
  • Существует специально закодированный способ предотвращения закрытия уведомления изнутри обратного вызова кнопки (возврат true из обратного вызова).
  • Выбрасывание ошибки для выполнения нормальной функциональности - обычно - плохая практика программирования. Это также приводит к ошибке, отображаемой на консоли при каждом нажатии кнопки. Ошибки, преднамеренно показывающие в консоли при нормальной работе, являются плохими. Это также может привести к тому, что ваше дополнение не будет одобрено в обзоре.
  • Как было документировано (не так оперативно), если вы хотите закрыть, когда одна кнопка была нажата, а не закрыта при нажатии другой, вам нужно будет сохранить глобальную переменную, для которой последний раз вызывал обратный вызов, а затем выберите на эту информацию, если вы хотите предотвратить закрытие, когда был выполнен обратный вызов notificationBox. Это было бы непродуманно сложным способом проектирования этих кнопок уведомлений.

Учитывая все это, я бы сказал, что намеренное обращение к ошибке, чтобы предотвратить закрытие, не является «правильным» способом сделать это. Несмотря на то, что вымывание ошибки для предотвращения закрытия не наносит вреда работе окна уведомлений, оно показывает ошибку в консоли, что плохо.

Правильный способ предотвращения уведомления из-за закрытия с помощью обратного вызова кнопки уведомления - вернуть значение True из обратного вызова.

Хотя возможно, что ранее неточно документированный способ сделать это так, как они намеревались использовать его, это не так, как он на самом деле работает.С учетом

  • Легче обновить документацию, чем внести изменения в код.
  • Код работает таким образом, который лучше, чем документированный метод.
  • В документации были другие неточности, которые помешали бы людям использовать функциональные возможности, которые предположительно работали (всплывающие окна/кнопки меню).

Я, таким образом, обновленный the documentation, чтобы отразить то, что на самом деле в исходном коде и скопировал, с некоторыми изменениями, код из этого ответа на пример там.

Вот код, я использовал, чтобы проверить это:

function testNotificationBoxWithButtons() { 
    //Create some common variables if they do not exist. 
    // This should work from any Firefox context. 
    // Depending on the context in which the function is being run, 
    // this could be simplified. 
    if (typeof window === "undefined") { 
     //If there is no window defined, get the most recent. 
     var window=Components.classes["@mozilla.org/appshell/window-mediator;1"] 
          .getService(Components.interfaces.nsIWindowMediator) 
          .getMostRecentWindow("navigator:browser"); 
    } 
    if (typeof gBrowser === "undefined") { 
     //If there is no gBrowser defined, get it 
     var gBrowser = window.gBrowser; 
    } 

    function testNotificationButton1Callback(theNotification, buttonInfo, eventTarget) { 
     window.alert("Button 1 pressed"); 

     //Prevent notification from closing: 
     //throw new Error('prevent nb close'); 
     return true; 
    }; 

    function testNotificationButton2Callback(theNotification, buttonInfo, eventTarget) { 
     window.alert("Button 2 pressed"); 

     //Do not prevent notification from closing: 
    }; 

    function testNotificationCallback(reason) { 
     window.alert("Reason is: " + reason); 

     //Supposedly prevent notification from closing: 
     //throw new Error('prevent nb close'); 
     // Does not work. 
    }; 


    let notifyBox = gBrowser.getNotificationBox(); 

    let buttons = []; 

    let button1 = { 
     isDefault: false, 
     accessKey: "1", 
     label: "Button 1", 
     callback: testNotificationButton1Callback, 
     type: "", // If a popup, then must be: "menu-button" or "menu". 
     popup: null 
    }; 

    buttons.push(button1); 

    let button2 = { 
     isDefault: true, 
     accessKey: "2", 
     label: "Button 2", 
     callback: testNotificationButton2Callback, 
     type: "", // If a popup, then must be: "menu-button" or "menu". 
     popup: null 
    }; 

    buttons.push(button2); 

    //appendNotification(label , value , image (URL) , priority , buttons, eventCallback) 
    notifyBox.appendNotification("My Notification text", "Test notification unique ID", 
           "chrome://browser/content/aboutRobots-icon.png", 
           notifyBox.PRIORITY_INFO_HIGH, buttons, 
           testNotificationCallback); 
} 
+1

Спасибо за разъяснение! Однако ваши изменения в документации еще не появились на сайте? Вы конкретно указали, что 'return true' будет препятствовать закрытию nb, так как это, похоже, тоже не документированное поведение. – tnull

+2

@tnull: Да, документация теперь включает в себя, что 'return true;' предотвращает закрытие уведомления. Если вы ранее просмотрели документацию для [appendNotification] (https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XUL/Method/appendNotification) или [уведомление] (https: // разработчик. mozilla.org/en-US/docs/Mozilla/Tech/XUL/notificationbox), вам нужно будет нажать ctrl-F5, чтобы обновить содержимое кеша связанных ресурсов. [Код] (http://mxr.mozilla.org/mozilla-central/source/toolkit/content/widgets/notification.xml#461) находится в файле notification.xml. – Makyen

+0

Ничего себе очень классный, я использовал, чтобы полагаться на 'throw new Error ('dont close')', чтобы предотвратить его закрытие. Спасибо, Майкен! – Noitidart

Смежные вопросы