Ciao, in particolare ci sono due "errori":
Errore 1
codice:
var tmp =$("#img_"+$scope.id).css('padding');
La proprietà padding è una proprietà abbreviata (come molte altre proprietà CSS) a cui appartengono delle relative specifiche (sotto)proprietà; che in questo caso sono padding-top, padding-right, padding-bottom, padding-left.
Come indicato nella documentazione relativa al metodo css() di jQuery, recuperare il valore di proprietà abbreviate potrebbe generare dei risultati non garantiti:
Retrieval of shorthand CSS properties (e.g., margin, background, border), although functional with some browsers, is not guaranteed. For example, if you want to retrieve the rendered border-width, use: $( elem ).css( "borderTopWidth" ), $( elem ).css( "borderBottomWidth" ), and so on.
fonte: http://api.jquery.com/css/
Questo significa che la tua variabile tmp potrebbe ottenere un valore inesatto o comunque un risultato inconsistente anche a seconda del browser. Su FF mi pare che restituisca una stringa vuota.
Come è consigliato nella documentazione, dovresti piuttosto usare una proprietà specifica; nel tuo caso potrebbe essere una cosa del genere:
var tmp = $("#img_"+$scope.id).css('paddingTop');
Errore 2
codice:
tmp.replace('px', '');
Il metodo replace() non modifica la variabile originale, come indicato nella documentazione:
This method does not change the original string.
fonte: https://www.w3schools.com/Jsref/jsref_replace.asp
Questo significa che la tua variabile tmp sostanzialmente non subirà alcun replace.
Come da esempio della documentazione, dovresti piuttosto riassegnare il valore modificato alla variabile stessa; nel tuo caso potrebbe essere una cosa del genere:
codice:
tmp = tmp.replace('px', '');
Il tuo codice potrebbe essere anche impostato in un'unica riga:
codice:
var tmp = $("#img_"+$scope.id).css('paddingTop').replace('px', '');
Consiglio
Vorrei avere il valore del padding in forma numerica e quindi pensavo di togliere px dalla stringa e poi fare un parseInt
Teoricamente potresti fare direttamente il parseInt senza il replace, funziona ugualmente e sarebbe anche più veloce:
codice:
var tmp = parseInt($("#img_"+$scope.id).css('paddingTop'));
Ad ogni modo c'è da tener conto che in entrambi i casi (sia col replace sia senza) otterresti la sola parte intera del valore. Ad esempio, se il valore fosse "56.789px" non verrebbe arrotondato a 57 (che in genere sarebbe più ottimale) ma avresti giusto 56. Se ti serve ottenere un valore più prossimo all'originale, dovresti magari usare delle funzioni di arrotondamento. Vedi tu.